首頁 > 後端開發 > Golang > 主體

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

WBOY
發布: 2024-02-06 08:45:07
轉載
312 人瀏覽過

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
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!