使用 Go 例程时,了解如何有效终止它们变得至关重要。考虑以下设置:
<code class="go">func startsMain() { go main() } func stopMain() { // TODO: Kill main } func main() { // Infinite loop }</code>
此设置在名为 main 的 goroutine 中创建一个无限循环。要终止循环,我们需要一种方法来从 stopMain 控制 Goroutine。
杀死 Goroutine 的一种有效方法是通过 Channel 和 select 语句。
<code class="go">var quit chan struct{} func startLoop() { quit := make(chan struct{}) go loop(quit) } func stopLoop() { close(quit) } func loop(quit chan struct{}) { for { select { case <-quit: return default: // Do stuff } } }</code>
在此示例中,我们使用名为 quit 的零大小通道(chan struct{})来指示 goroutine 停止。 Loop 函数使用 select 语句重复检查退出通道。当 quit 收到一个值(表示停止请求)时,循环退出。
Go 提供了额外的并发模式来处理 goroutine。请访问 Go 博客,了解有关这些模式的更多见解。
要定期执行函数,同时避免 CPU 耗尽,您可以使用代码。
<code class="go">import "time" // [...] func loop() { ticker := time.NewTicker(2 * time.Second) defer ticker.Stop() for { select { case <-quit: return case <-ticker.C: // Do stuff } } }</code>
在这种情况下,选择块,直到 quit 接收到值或股票触发,从而允许该函数以指定的时间间隔执行。
以上是如何有效地终止 Go 中的 Goroutine?的详细内容。更多信息请关注PHP中文网其他相关文章!