在這種情況下,需要指示 Go 程式停止運作。主要挑戰在於在不引入阻塞行為的情況下實現此訊號。
建議的解決方案涉及使用輔助通道。但是,如果 go 例程在主動處理資料時嘗試從該通道接收訊號,則傳統的通道使用將導致阻塞。
為了避免阻塞,程式碼可以利用預設子句的選擇案例。這允許 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而不是通道。條件變數提供了一種在 goroutine 之間等待和發出訊號的方法。
使用帶有預設子句或sync.Cond 的輔助通道,您可以有效地向 go 例程發出停止信號運行而不訴諸阻塞行為。
以上是如何在不阻塞的情況下向 Go 例程發出停止信號?的詳細內容。更多資訊請關注PHP中文網其他相關文章!