首页 >后端开发 >Golang >Go 中如何让主 Goroutine 无限期运行?

Go 中如何让主 Goroutine 无限期运行?

Patricia Arquette
Patricia Arquette原创
2024-12-17 21:25:10182浏览

How Can I Keep the Main Goroutine Running Indefinitely in Go?

延长 Go 中主 Goroutine 的存在

永恒沉睡

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)

Sleep Without Blocking

如果目标是防止主 goroutine 在不阻塞的情况下终止,则time.Sleep() 函数可以使用足够长的持续时间,上限约为 292 年:

time.Sleep(time.Duration(1<<63 - 1))

对于延长的持续时间,请考虑合并上述 time.Sleep() 的无限循环:

for {
    time.Sleep(time.Duration(1<<63 - 1))
}

以上是Go 中如何让主 Goroutine 无限期运行?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn