新聞中心
在講解并發(fā)概念時(shí),總會(huì)涉及另外一個(gè)概念并行。下面讓我們來(lái)了解并發(fā)和并行之間的區(qū)別。

- 并發(fā)(concurrency):把任務(wù)在不同的時(shí)間點(diǎn)交給處理器進(jìn)行處理。在同一時(shí)間點(diǎn),任務(wù)并不會(huì)同時(shí)運(yùn)行。
- 并行(parallelism):把每一個(gè)任務(wù)分配給每一個(gè)處理器獨(dú)立完成。在同一時(shí)間點(diǎn),任務(wù)一定是同時(shí)運(yùn)行。
并發(fā)不是并行。并行是讓不同的代碼片段同時(shí)在不同的物理處理器上執(zhí)行。并行的關(guān)鍵是同時(shí)做很多事情,而并發(fā)是指同時(shí)管理很多事情,這些事情可能只做了一半就被暫停去做別的事情了。
在很多情況下,并發(fā)的效果比并行好,因?yàn)椴僮飨到y(tǒng)和硬件的總資源一般很少,但能支持系統(tǒng)同時(shí)做很多事情。這種“使用較少的資源做更多的事情”的哲學(xué),也是指導(dǎo) Go語(yǔ)言設(shè)計(jì)的哲學(xué)。
如果希望讓 goroutine 并行,必須使用多于一個(gè)邏輯處理器。當(dāng)有多個(gè)邏輯處理器時(shí),調(diào)度器會(huì)將 goroutine 平等分配到每個(gè)邏輯處理器上。這會(huì)讓 goroutine 在不同的線程上運(yùn)行。不過(guò)要想真的實(shí)現(xiàn)并行的效果,用戶需要讓自己的程序運(yùn)行在有多個(gè)物理處理器的機(jī)器上。否則,哪怕 Go語(yǔ)言運(yùn)行時(shí)使用多個(gè)線程,goroutine 依然會(huì)在同一個(gè)物理處理器上并發(fā)運(yùn)行,達(dá)不到并行的效果。
下圖展示了在一個(gè)邏輯處理器上并發(fā)運(yùn)行 goroutine 和在兩個(gè)邏輯處理器上并行運(yùn)行兩個(gè)并發(fā)的 goroutine 之間的區(qū)別。調(diào)度器包含一些聰明的算法,這些算法會(huì)隨著 Go語(yǔ)言的發(fā)布被更新和改進(jìn),所以不推薦盲目修改語(yǔ)言運(yùn)行時(shí)對(duì)邏輯處理器的默認(rèn)設(shè)置。如果真的認(rèn)為修改邏輯處理器的數(shù)量可以改進(jìn)性能,也可以對(duì)語(yǔ)言運(yùn)行時(shí)的參數(shù)進(jìn)行細(xì)微調(diào)整。
圖:并發(fā)與并行的區(qū)別
Go語(yǔ)言在 GOMAXPROCS 數(shù)量與任務(wù)數(shù)量相等時(shí),可以做到并行執(zhí)行,但一般情況下都是并發(fā)執(zhí)行。
文章標(biāo)題:創(chuàng)新互聯(lián)GO教程:并發(fā)和并行的區(qū)別
新聞來(lái)源:http://www.5511xx.com/article/cdejgeh.html


咨詢
建站咨詢
