go语言os.exit(1)_在Golang中各种永远阻塞的姿势
在Golang中各種永遠阻塞的姿勢
Go的運行時的當前設計,假定程序員自己負責檢測何時終止一個goroutine以及何時終止該程序。
可以通過調用os.Exit或從main()函數的返回來以正常方式終止程序。而有時候我們需要的是使程序阻塞在這一行。
使用sync.WaitGroup
一直等待直到WaitGroup等于0
package main
import "sync"
func main() {
var wg sync.WaitGroup
wg.Add(1)
wg.Wait()
}
空select
select{}是一個沒有任何case的select,它會一直阻塞
package main
func main() {
select{}
}
死循環
雖然能阻塞,但會100%占用一個cpu。不建議使用
package main
func main() {
for {}
}
用sync.Mutex
一個已經鎖了的鎖,再鎖一次會一直阻塞,這個不建議使用
package main
import "sync"
func main() {
var m sync.Mutex
m.Lock()
m.Lock()
}
os.Signal
系統信號量,在go里面也是個channel,在收到特定的消息之前一直阻塞
package main
import (
"os"
"syscall"
"os/signal"
)
func main() {
sig := make(chan os.Signal, 2)
signal.Notify(sig, syscall.SIGTERM, syscall.SIGINT)
}
空channel或者nil channel
channel會一直阻塞直到收到消息,nil channel永遠阻塞。
package main
func main() {
c := make(chan struct{})
}
package main
func main() {
var c chan struct{} //nil channel
}
總結
注意上面寫的的代碼大部分不能直接運行,都會panic,提示“all goroutines are asleep - deadlock!”,因為go的runtime會檢查你所有的goroutine都卡住了,
沒有一個要執行。你可以在阻塞代碼前面加上一個或多個你自己業務邏輯的goroutine,這樣就不會deadlock了。
參考
總結
以上是生活随笔為你收集整理的go语言os.exit(1)_在Golang中各种永远阻塞的姿势的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 加载中图片 转圈_对话洛可可平面设计师:
- 下一篇: python如何计算整数和_python