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

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

如果一個 Goroutine 正在運行,請停止它

如果一個 Goroutine 正在運行,請停止它

Go
SMILET 2022-08-24 15:44:30
我有一個類似于如何用一個小扭曲來阻止Goroutine的問題。我不確定戈魯丁是否正在運行。var quit = make(chan bool)func f1() {    go func() {        t := time.NewTimer(time.Minute)        select {        case <-t.C:            // Do stuff        case <-quit:            return        }    }()}func f2() {    quit <- true}如果在不到一分鐘后被調用,則 goroutine 返回。但是,如果它在一分鐘后被調用,則goroutine將已經返回并會阻塞。如果 goroutine 正在運行,我想取消它,否則不執行任何操作。f2()f1()f2()f2()我在這里試圖實現的是執行一項任務,當且僅當它在創建后的一分鐘內沒有被取消。澄清:沒有什么可以阻止被多次調用。f2()一次只有一個戈魯丁在奔跑。的調用方將確保每分鐘調用的次數不超過一次。f1()
查看完整描述

2 回答

?
慕仙森

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

使用上下文。


使用可能被取消的上下文運行。使用關聯的取消函數運行。f1f2


func f1(ctx context.Context) {

    go func(ctx context.Context) {

        t := time.NewTimer(time.Minute)

        select {

        case <-t.C:

            // Do stuff

        case <-ctx.Done():

            return

        }

    }(ctx)

}


func f2(cancel context.CancelFunc) {

    cancel()

}

稍后,為了協調這兩個函數,您將執行以下操作:


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

    f1(ctx)

    f2(cancel)

您還可以試驗該函數以合并外部定義的超時。context.WithTimeout


如果您不知道是否已經有一個goroutine在運行,您可以像上面那樣初始化和變量,但不要將它們傳遞給任何東西。這樣就避免了必須檢查 .ctxcancelnil


請記住將 ctx 和 cancel 視為要復制的變量,而不是引用,因為您不希望多個 goroutine 共享內存 - 這可能會導致爭用條件。


查看完整回答
反對 回復 2022-08-24
?
jeck貓

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

您可以為通道指定緩沖區大小為 1。這意味著您可以在不阻塞的情況下向其發送一個值,即使該值沒有立即(或根本沒有收到)也是如此。

var quit = make(chan bool, 1)

我認為最好的答案是更好的,這只是另一種可以轉化為其他情況的解決方案。


查看完整回答
反對 回復 2022-08-24
  • 2 回答
  • 0 關注
  • 100 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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