網站首頁 編程語言 正文
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() }
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) <-sig }
空 channel 或者 nil channel
channel 會一直阻塞直到收到消息,nil channel 永遠阻塞。
package main func main() { c := make(chan struct{}) <-c }
package main func main() { var c chan struct{} //nil channel <-c }
總結
注意上面寫的的代碼大部分不能直接運行,都會 panic,提示“all goroutines are asleep - deadlock!”,因為 go 的 runtime 會檢查你所有的 goroutine 都卡住了, 沒有一個要執行。你可以在阻塞代碼前面加上一個或多個你自己業務邏輯的 goroutine,這樣就不會 deadlock 了。
參考
https://pliutau.com/different-ways-to-block-go-runtime-forever/
原文鏈接:https://juejin.cn/post/6844903598216871943
相關推薦
- 2022-08-28 elasticsearch-倒排索引原理
- 2022-12-24 C#如何優雅的對WinForm窗體應用程序進行權限控制_C#教程
- 2022-11-09 CSS元素定位
- 2022-10-06 Python時間戳與日期格式之間相互轉化的詳細教程_python
- 2023-06-20 在VScode里面添加Python解釋器的詳細步驟_python
- 2022-12-04 C#實現Oracle批量寫入數據的方法詳解_C#教程
- 2022-10-31 一文詳解如何使用Redis實現分布式鎖_Redis
- 2022-05-10 使用node讀取文件和寫入文件
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支