使用信号停止 Goroutine
在 Go 中,goroutine 是用于并发的轻量级线程。然而,在某些情况下我们可能需要提前终止一个 goroutine。本文探讨了如何使用信号机制来实现这一目标。
在提供的代码中,目标是当特定条件(tooLate)变为真时停止 goroutine。然而,使用建议的第二个通道确实会在读取时阻塞 goroutine。
通过 Select 使用附加通道
更好的方法是创建一个单独的通道 ( tooLate) 并在 goroutine 中使用 select 来监视处理通道 (proCh) 和 tooLate 通道。当tooLate收到信号时,goroutine可以正常终止。
<code class="go">package main import "fmt" import "time" func main() { tooLate := make(chan struct{}) proCh := make(chan string) go func() { for { fmt.Println("working") time.Sleep(1 * time.Second) select { case <-tooLate: fmt.Println("stopped") return case proCh <- "processed": default: // Adding default makes it non-blocking } fmt.Println("done here") } }() select { case proc := <-proCh: fmt.Println(proc) case <-time.After(1 * time.Second): fmt.Println("too late") close(tooLate) } time.Sleep(4 * time.Second) fmt.Println("finish\n") }</code>
在这个更新的代码中,当计时器到期(表明为时已晚)时,tooLate通道被关闭,向goroutine发送信号。 Goroutine 接收此信号并相应地终止。
使用sync.Cond
另一个需要考虑的选项是使用sync.Cond,它提供了对信号更精细的控制。然而,它需要更多的设置和同步逻辑。
以上是如何使用信号优雅地停止 Go 中的 Goroutine?的详细内容。更多信息请关注PHP中文网其他相关文章!