深入理解GoLang并發(fā)與并行
Go 里的并發(fā)(Concurrency)和并行(Parallelism),是面試高頻、也是理解 goroutine 的核心。給你一套能講清 + 能拿分的版本??
?? 一句話核心區(qū)別
并發(fā)是“同時處理多個任務的能力”,并行是“同時執(zhí)行多個任務的能力”。
?? 一、并發(fā)(Concurrency)
?? 重點:任務可以交替執(zhí)行
即使只有 1 個 CPU 核心,也能并發(fā)。
示例
go task1() go task2()
在單核情況下:
- 執(zhí)行 task1 一會
- 切到 task2
- 再切回來
?? 本質(zhì):調(diào)度切換
特點
- 不一定同時執(zhí)行
- 是一種“程序結構設計”
- Go 用 goroutine + channel 實現(xiàn)
?? 二、并行(Parallelism)
?? 重點:多個任務真正同時執(zhí)行
必須依賴:
- 多核 CPU
- Go 調(diào)度器(GMP)
示例
2 核 CPU:
- task1 在 核1 跑
- task2 在 核2 跑
?? 真正同時執(zhí)行
特點
- 一定同時執(zhí)行
- 用于提升計算速度
- 屬于“硬件 + 調(diào)度能力”
?? 三、Go 是怎么實現(xiàn)的?
Go 的核心設計:
用 goroutine 實現(xiàn)并發(fā),用 GMP 調(diào)度實現(xiàn)并行
?? 關鍵點
1?? goroutine = 并發(fā)單位
不是線程,也不等于并行
2?? 是否并行取決于:
runtime.GOMAXPROCS(n)
?? 默認:
= CPU 核心數(shù)
3?? GMP 模型作用
- G(goroutine)
- P(調(diào)度器)
- M(線程)
?? 調(diào)度流程:G → P → M → CPU 執(zhí)行
?? 四、一個非常好用的類比(面試加分)
并發(fā)(一個人做多件事)
一個廚師:
- 一會炒菜
- 一會切菜
- 一會煮面
?? 來回切換
并行(多個人同時做)
多個廚師:
- 一個炒菜
- 一個煮面
- 一個切菜
?? 同時進行
?? 五、Go 代碼對比(面試常用)
并發(fā)(未必并行)
for i := 0; i < 2; i++ {
go func(i int) {
fmt.Println(i)
}(i)
}
time.Sleep(time.Second)?? 有多個 goroutine,但不保證同時執(zhí)行
并行(利用多核)
runtime.GOMAXPROCS(4)
?? 允許 4 個線程同時運行
?? 六、常見誤區(qū)(一定要會)
? goroutine = 并行
?? 錯,只是并發(fā)
? 并發(fā)一定更快
?? 不一定:
- 有上下文切換開銷
- 有鎖競爭
? 開越多 goroutine 越好
?? 錯:
- CPU 密集 → 會更慢
- 調(diào)度壓力大
?? 七、終極總結(面試王炸)
?? 直接這樣說:
在 Go 中,并發(fā)是通過 goroutine 實現(xiàn)的任務組織方式,而并行是通過 GMP 調(diào)度器在多核 CPU 上同時執(zhí)行多個 goroutine。goroutine 本身不保證并行,是否并行取決于運行環(huán)境和調(diào)度器配置。
到此這篇關于深入理解GoLang并發(fā)與并行的文章就介紹到這了,更多相關GoLang并發(fā)與并行內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Go 如何基于IP限制HTTP訪問頻率的方法實現(xiàn)
這篇文章主要介紹了Go 如何基于IP限制HTTP訪問頻率的方法實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-11-11
Golang使用archive/zip包實現(xiàn)ZIP壓縮與解壓
Golang?中的?archive/zip?包用于處理?ZIP?格式的壓縮文件,提供了一系列用于創(chuàng)建、讀取和解壓縮?ZIP?格式文件的函數(shù)和類型,使用起來非常方便,下面就跟隨小編一起了解一下具體使用方法吧2023-08-08

