Go 提供了一系列机制来保持主 Goroutine 无限期运行而不消耗处理能力。考虑以下策略:
不带 Cases 的选择:通过不带 case 或 default 子句的 select 语句可以实现永远阻塞而不消耗 CPU:
select {}
从空接收Channel:主 Goroutine 可以通过从空 Channel 连续接收来无限期挂起:
<-make(chan int)
从 Nil Channel 接收:类似地,接收从零通道产生相同的结果效果:
<-chan int(nil)
发送到nil通道:发送到nil通道也会永久挂起主goroutine:
(chan int)(nil) <- 0
锁定预锁定互斥体:锁定已经锁定的互斥体会有效地停止主goroutine:
mu := sync.Mutex{} mu.Lock() mu.Lock()
为了促进优雅退出,专用的退出通道可以被利用。当需要终止程序时,关闭此通道:
var quit = make(chan struct{}) func main() { defer close(quit) // Application code... <-quit }
在单独的 Goroutine 中,关闭退出通道会触发主 Goroutine 的退出:
close(quit)
如果目标是防止主 goroutine 在不阻塞的情况下终止,则time.Sleep() 函数可以使用足够长的持续时间,上限约为 292 年:
time.Sleep(time.Duration(1<<63 - 1))
对于延长的持续时间,请考虑合并上述 time.Sleep() 的无限循环:
for { time.Sleep(time.Duration(1<<63 - 1)) }
以上是Go 中如何让主 Goroutine 无限期运行?的详细内容。更多信息请关注PHP中文网其他相关文章!