首頁  >  文章  >  後端開發  >  Go - 永遠停止帶有上下文的循環

Go - 永遠停止帶有上下文的循環

WBOY
WBOY轉載
2024-02-06 08:45:07312瀏覽

Go - 永远停止带有上下文的循环

問題內容

我有一個非同步進程,它應該永遠持續下去,如下所示:

func asyncforevertask() {
  for {
    anytask()
  }
}

func main() {
  go asyncforevertask()

  server.run(8080)
}

我希望能夠在某個請求到達伺服器時停止這個 for 迴圈。

我知道我需要使用 context.withcancel(),但我不知道如何整合它才能工作。我知道以下語法:

for {
  select {
  case <-ctx.Done:
    return
  case <-otherCh:
    // do smh.
  }
}

但是 asyncforevertask 不是由來自任何 otherch 的訊號運行的,但它會永遠運行。我是一個菜鳥,非常感謝任何類型的幫助。


正確答案


您可以使用通道來執行此操作:

var stopasync = make(chan struct{})

func asyncforevertask() {
  for {
    select {
      case <-stopasync:
         return
      default:
    }
    anytask()
  }
}

要取消,只需關閉頻道即可。您必須確保通道僅關閉一次,否則您會感到恐慌。

您也可以透過上下文執行此操作:

func main() {
   ctx,cancel:=context.withcancel(context.background())
   go asyncforevertask(ctx)
   ...
}

func asyncforevertask(ctx context.context) {
  for {
    select {
      case <-ctx.done():
         return
      default:
    }
    anytask()
  }
}

或:

func asyncforevertask(ctx context.context) {
  for {
    if ctx.err()!=nil {
       return
    }
    anytask()
  }

要停止,請呼叫傳回的 cancel 函數:

...
cancel()

如果您還需要停止 anytask,則必須經常檢查通道關閉或上下文關閉並從任務返回。

以上是Go - 永遠停止帶有上下文的循環的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除