首頁  >  文章  >  後端開發  >  如何在不阻塞的情況下向 Go 例程發出停止信號?

如何在不阻塞的情況下向 Go 例程發出停止信號?

Patricia Arquette
Patricia Arquette原創
2024-10-28 05:00:30128瀏覽

How to Signal a Go Routine to Halt without Blocking?

向 Go 程式發出停止訊號

在這種情況下,需要指示 Go 程式停止運作。主要挑戰在於在不引入阻塞行為的情況下實現此訊號。

建議的解決方案涉及使用輔助通道。但是,如果 go 例程在主動處理資料時嘗試從該通道接收訊號,則傳統的通道使用將導致阻塞。

使用 Select Case

為了避免阻塞,程式碼可以利用預設子句的選擇案例。這允許 go 例程繼續處理數據,直到從輔助通道接收到訊號:

<code class="go">go func() {
    for {
        fmt.Println("working")
        time.Sleep(1 * time.Second)
        select {
        case <-tooLate:
            fmt.Println("stopped")
            return
        case proCh <- "processed": //this why it won't block the goroutine if the timer expirerd.
        default: // adding default will make it not block
        }
        fmt.Println("done here")
    }
}()</code>

透過利用 default 子句,go 例程即使在計時器到期時也可以避免阻塞。

使用sync.Cond

另一種方法涉及使用sync.Cond而不是通道。條件變數提供了一種在 goroutine 之間等待和發出訊號的方法。

結論

使用帶有預設子句或sync.Cond 的輔助通道,您可以有效地向 go 例程發出停止信號運行而不訴諸阻塞行為。

以上是如何在不阻塞的情況下向 Go 例程發出停止信號?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn