不记得域名管理网站,wordpress侧边栏在哪,婴儿衣服做的网站,兰州新闻最新消息在Golang中各种永远阻塞的姿势Go的运行时的当前设计#xff0c;假定程序员自己负责检测何时终止一个goroutine以及何时终止该程序。可以通过调用os.Exit或从main()函数的返回来以正常方式终止程序。而有时候我们需要的是使程序阻塞在这一行。使用sync.WaitGroup一直等待直到Wa…在Golang中各种永远阻塞的姿势Go的运行时的当前设计假定程序员自己负责检测何时终止一个goroutine以及何时终止该程序。可以通过调用os.Exit或从main()函数的返回来以正常方式终止程序。而有时候我们需要的是使程序阻塞在这一行。使用sync.WaitGroup一直等待直到WaitGroup等于0package mainimport syncfunc main() {var wg sync.WaitGroupwg.Add(1)wg.Wait()}空selectselect{}是一个没有任何case的select它会一直阻塞package mainfunc main() {select{}}死循环虽然能阻塞但会100%占用一个cpu。不建议使用package mainfunc main() {for {}}用sync.Mutex一个已经锁了的锁再锁一次会一直阻塞这个不建议使用package mainimport syncfunc main() {var m sync.Mutexm.Lock()m.Lock()}os.Signal系统信号量在go里面也是个channel在收到特定的消息之前一直阻塞package mainimport (ossyscallos/signal)func main() {sig : make(chan os.Signal, 2)signal.Notify(sig, syscall.SIGTERM, syscall.SIGINT)}空channel或者nil channelchannel会一直阻塞直到收到消息nil channel永远阻塞。package mainfunc main() {c : make(chan struct{})}package mainfunc main() {var c chan struct{} //nil channel}总结注意上面写的的代码大部分不能直接运行都会panic提示“all goroutines are asleep - deadlock!”因为go的runtime会检查你所有的goroutine都卡住了没有一个要执行。你可以在阻塞代码前面加上一个或多个你自己业务逻辑的goroutine这样就不会deadlock了。参考