Golang 多核並行
並行和併發
併發:一個處理器依次處理多個任務。併發一般是被核心通過時間片或者中斷來控制的,遇到io阻塞或者時間片用完的時會轉移執行緒的使用權。

image.png
並行:多個處理器或者是多核的處理器同時處理多個不同的任務。一個核的情況下不可能有並行的情況,因為同一時間只有一個任務在排程。

image.png
Golang的並行
Golang預設情況下都是使用一個cpu來執行goroutine的任務,所以在預設的情況下並不能執行併發任務。如果想使用多核並行的任務,可以通過runtime.GOMAXPROCS()來設定CPU的個數的個數,當然這個數不能超過計算機擁有的CPU 。
一個簡單的多核處理多工的案例
func DoTask(wg *sync.WaitGroup) int { n := 2 for i := 0; i < 20000; i++ { for j := 0; j < 100000; j++ { if n > 1000000 { n = n - 10000000 } else { n++ } } } (*wg).Done() return n } func DoTasks(x int) { runtime.GOMAXPROCS(x) var wg sync.WaitGroup start := time.Now().UnixNano() for i := 0; i < 12; i++ { wg.Add(1) go DoTask(&wg) } wg.Wait() fmt.Println("cpu", x, time.Now().UnixNano()-start, "ns") } func main() { for i := 1; i <= 8; i++ { DoTasks(i) } }
Out:
cpu 1 20926279682 ns cpu 2 10630461280 ns cpu 3 7169233923 ns cpu 4 6381706481 ns cpu 5 6257451468 ns cpu 6 5511429381 ns cpu 7 5656876595 ns cpu 8 5336274087 ns
可以看到隨著cpu數量的增加執行的時間也相對的簡少,但是當cpu數量大於4後,其執行的時間也就趨向於穩定,這是當設定的cpu數量系統的實際cpu,系統會預設的將GOMAXPROCS設定為系統的最大CPU。另外我們也可以通過top命令過程程式,可以發現CPU的使用率最終會穩定在400%附近。

1549021986175.png