亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

阻止 goroutine 執行

阻止 goroutine 執行

Go
互換的青春 2022-10-10 18:58:56
我有一個功能如下:func keepConnUp(n netAddr, w chan<- io.Writer, err chan error) {    addr := fmt.Sprintf("%s:%d", n.Addr, n.Port)    for {        <-err        time.Sleep(reconnectTimer)        conn, _ := net.Dial(n.Network, addr)        w <- conn    }}目標是當我收到來自err chan. 但是,如果我已經在撥號或在某個時間段內,我不想重撥。但是,我可能會收到很多我不想阻止的錯誤。我怎么能那樣做?編輯到目前為止我已經實施的解決方案:func keepConnUp(n netAddr, w chan<- io.Writer, err chan error) {    addr := fmt.Sprintf("%s:%d", n.Addr, n.Port)    done := make(chan bool)    isDialing := false    for {        select {        case <-err:            if !isDialing {                isDialing = true                time.AfterFunc(reconnectTimer, func() {                    done <- true                })                            }        case <-done:            conn, _ := net.Dial(n.Network, addr)            w <- conn            isDialing = false        }    }}
查看完整描述

3 回答

?
蝴蝶刀刀

TA貢獻1801條經驗 獲得超8個贊

context.Context自從我從事 Go 工作以來已經有一段時間了,但我嘗試使用and讓它工作sync.Once。我還沒有測試過這個。


func keepConnUp(n netAddr, w chan<- io.Writer, err chan error) {

    addr := fmt.Sprintf("%s:%d", n.Addr, n.Port)

    done := make(chan bool)


    ctx, cancel := context.WithCancel(context.Background())

    cancel() // So that ctx.Err() returns non-nil on the first try

    once := sync.Once{}


    for {

        <-err

        if ctx.Err() != nil {

            once.Do(func() {

                conn, _ := net.Dial(n.Network, addr)

                w <- conn

            })

            once = sync.Once{} // Reset once

            ctx = context.WithTimeout(reconnectTimer) // Reset context timeout

        }

    }

}




查看完整回答
反對 回復 2022-10-10
?
吃雞游戲

TA貢獻1829條經驗 獲得超7個贊

type Conn struct {

    conn net.Conn

    dialing bool

    mu sync.Mutex

}


func (c Conn) Dial() {

    c.mu.Lock()

    if c.dialing {

        c.mu.Unlock()

        return

    }

    c.dialing = true

    c.mu.Unlock()

    time.AfterFunc(reconnectTimer, func() {

        c.conn, _ := net.Dial(n.Network, addr)

        w <- c.conn

        c.dialing = false

    })

}

現在你可以調用Conn.Dial()一個 goroutine


查看完整回答
反對 回復 2022-10-10
?
慕桂英546537

TA貢獻1848條經驗 獲得超10個贊

也許您可以使用sync.WaitGroup它來確保在錯誤后只有一次重撥呼叫。



查看完整回答
反對 回復 2022-10-10
  • 3 回答
  • 0 關注
  • 144 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號