目錄
什么是 Goroutine,它與線程有何區別?
如何創建一個 Goroutine?有哪些方式?
Goroutine 執行函數時傳遞參數應注意什么問題?
使用 Goroutine 時如何確保主線程不會提前退出?
多個 Goroutine 寫共享變量時會出現什么問題?如何解決?
如何用 sync.WaitGroup 管理 Goroutine 生命周期?
如何優雅地停止一個正在運行的 Goroutine?
Goroutine 在什么情況下會泄露?如何檢測和避免?
Go 中 Goroutine 的棧空間如何管理?會自動擴展嗎?
使用 Goroutine 實現并發爬蟲應注意哪些問題?
為什么說 Go 的并發是“協作式”而不是“搶占式”?
Goroutine 和線程池有何關系?Go 中是否需要線程池?
如何使用 context 控制 Goroutine 的超時和取消?
Goroutine 數量暴漲會帶來哪些性能問題?
如何查看當前運行的 Goroutine 數量?有哪些調試技巧?
Go 中的 Channel 是如何工作的?有哪些底層機制?
Channel 有哪些類型?如何選擇合適類型?
Buffered Channel 和 Unbuffered Channel 有什么區別?
為什么說 Channel 是 CSP 模型的實現?
關閉一個 Channel 后還能讀寫嗎?會發生什么?
Goroutine 執行函數時傳遞參數應注意什么問題?
使用 Goroutine 時如何確保主線程不會提前退出?
多個 Goroutine 寫共享變量時會出現什么問題?如何解決?
如何判斷一個 Channel 是否已經被關閉?
使用 select 實現多路復用時應該注意哪些陷阱?
什么是 nil channel?它在 select 中的行為是什么?
如何使用 Channel 實現 Goroutine 的并發控制?
如何使用 Channel 構建一個生產者-消費者模型?
Go 中的 GMP 模型分別代表什么?
Goroutine 是如何在 M 上調度運行的?
G 是如何從 P 獲取的?調度器如何分配任務?
Go 中的線程(M)是否等于系統線程?
調度器如何感知 Goroutine 被阻塞或喚醒?
Go 中的 GMP 模型分別代表什么?
Goroutine 是如何在 M 上調度運行的?
G 是如何從 P 獲取的?調度器如何分配任務?
Go 中的線程(M)是否等于系統線程?
調度器如何感知 Goroutine 被阻塞或喚醒?
Go 中的 GMP 模型分別代表什么?
Goroutine 是如何在 M 上調度運行的?
G 是如何從 P 獲取的?調度器如何分配任務?
Go 中的線程(M)是否等于系統線程?
調度器如何感知 Goroutine 被阻塞或喚醒?
當 Goroutine 數量遠遠大于 P 時會發生什么?
如何使用 GOMAXPROCS?它與 P 有什么關系?
Go 是怎么實現用戶態和內核態之間的切換的?
GMP 模型如何支持異步 IO 操作?
Go 1.14 后引入了“搶占式調度”,它是如何實現的?
一、信號觸發搶占
二、函數序言插樁
三、搶占流程
四、與協作式調度的對比
五、優化與限制
sync.Mutex 的實現原理是什么?它如何避免競態?
sync.RWMutex 適用于哪些場景?與 Mutex 有何不同?
atomic 包與 sync 包的區別與適用場景?
sync.Once 的內部機制是什么?它是線程安全的嗎?
Go 中是否支持信號量?如何模擬實現?
sync.Map 的底層結構與性能特點?
底層結構
性能特點
適用場景與限制
與普通 map+Mutex 的對比
注意事項
為什么不推薦在多個 Goroutine 中直接共享 map?
一、map 的非線程安全特性
二、底層實現的風險細節
三、Go 官方的明確限制
四、替代方案與最佳實踐
五、總結:為什么不推薦?
使用 pprof 工具分析 Goroutine 泄漏的方法?
一、pprof 簡介與開啟方式
二、分析 Goroutine 泄漏的核心步驟
1. 獲取 Goroutine 堆棧信息
2. 解析輸出內容
3. 過濾與分組堆棧
4. 對比不同時間點的堆棧
5. 結合業務邏輯分析
三、實戰案例:診斷通道阻塞導致的泄漏
四、最佳實踐與注意事項
如何調試 Go 程序中的死鎖問題?
一、利用運行時自動檢測
二、手動分析死鎖的常見場景
1. 通道死鎖
2. 互斥鎖死鎖
3. WaitGroup 死鎖
三、使用 pprof 診斷死鎖
四、實戰調試步驟示例
五、預防死鎖的最佳實踐
實戰中如何選擇 Goroutine 數量與 Channel 緩沖區大小?
一、Goroutine 數量的選擇原則
1. CPU 核數與 P 的數量
2. 任務類型(CPU 密集型 vs IO 密集型)
3. 系統資源限制
4. 動態調整與監控
二、Channel 緩沖區大小的選擇策略
1. 無緩沖通道(緩沖區大小 0)
2. 有緩沖通道(緩沖區大小 >0)
3. 經驗法則與計算方法
4. 動態調整與壓力測試
三、實戰案例:文件處理系統
四、常見誤區與注意事項