Golang 多核并行

并行和并發(fā)

并發(fā):一個處理器依次處理多個任務(wù)。并發(fā)一般是被內(nèi)核通過時間片或者中斷來控制的,遇到io阻塞或者時間片用完的時會轉(zhuǎn)移線程的使用權(quán)。


image.png

并行:多個處理器或者是多核的處理器同時處理多個不同的任務(wù)。一個核的情況下不可能有并行的情況,因為同一時間只有一個任務(wù)在調(diào)度。

image.png

Golang的并行

Golang默認(rèn)情況下都是使用一個cpu來執(zhí)行g(shù)oroutine的任務(wù),所以在默認(rèn)的情況下并不能執(zhí)行并發(fā)任務(wù)。如果想使用多核并行的任務(wù),可以通過runtime.GOMAXPROCS()來設(shè)置CPU的個數(shù)的個數(shù),當(dāng)然這個數(shù)不能超過計算機擁有的CPU 。

一個簡單的多核處理多任務(wù)的案例

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數(shù)量的增加運行的時間也相對的簡少,但是當(dāng)cpu數(shù)量大于4后,其運行的時間也就趨向于穩(wěn)定,這是當(dāng)設(shè)置的cpu數(shù)量系統(tǒng)的實際cpu,系統(tǒng)會默認(rèn)的將GOMAXPROCS設(shè)置為系統(tǒng)的最大CPU。另外我們也可以通過top命令過程程序,可以發(fā)現(xiàn)CPU的使用率最終會穩(wěn)定在400%附近。

1549021986175.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容