這是兩個英文解釋邊界都很模糊的單詞,翻譯到中文裏就更讓人滿頭霧水了。網友對這兩個詞的解釋也是各執一詞,網友在Stack Overflow 上也問過這個問題What is the difference between concurrency and parallelism?, 排名最高的解釋與咱們日常接收到的一致:Parallelism(並行) 表示多個任務在同一時間同時運行,並發表示多個任務能夠在不一樣的時間片上執行,但某一個時刻能夠只有一個任務運行。在我看來這個定義的給人的感受區別就在於CPU 是單核仍是多核,沒有什麼價值。二樓的網友給出了parallelism 和 concurrency 之間不一樣的關鍵特徵:Parallelism: Independentability, Concurrency: Interruptability
, 並舉了四種狀況的例子。golang
關鍵是這兩個單詞對咱們的開發有什麼指導意義呢?從字面含義上來看徹底沒有頭緒,咱們設計程序時若是牽扯到多線程編程該以哪一個爲指導呢?或者二者都須要考慮?(併發編程字面上含有併發,但爲什麼如此?並行就不須要考慮了麼?)編程
Haskell 在wiki裏對這二者有過一篇文章, 裏面給出瞭解釋:The term Parallelism refers to techniques to make programs faster by performing several computations at the same time. The term Concurrency refers to techniques that make programs more usable.
並行是爲了提高計算速度的技術,而併發是爲了使程序更合用。If you run distributed-net computations in the background while working with interactive applications in the foreground, that is concurrency. On the other hand, dividing a task into packets that can be computed via distributed-net clients is parallelism.
. Go 的發明者 Rob Pike 曾對這個作過一個 presentation Concurrency is not parallelism, 他將 concurrency 當作指導咱們編程的準則,也就是他說的Concurrency is about dealing with lots of things at once. Parallelism is about doing lots of things at once.
咱們須要將任務一步步分解開來,在腦海中描繪完成任務所需的步驟,每一步能夠是獨立的也能夠依賴其餘的步驟。當咱們將任務步驟完成後,這個總體能夠拷貝複製不少份並行執行。多線程
在單機編程中,線程是最小的執行單位,在這個維度上咱們只考慮併發對咱們的影響,由於執行是不太須要咱們關心的,OS 能夠本身作好調度。在分佈式系統中,單臺機器變成了最小的單位,咱們不只要考慮併發,還須要考慮並行。一堆任務如何分解成一系列步驟,步驟之間多是相互依賴的,這是併發維度;這一堆任務分紅不一樣的組,任務之間是能夠並行執行的,還須要考慮調度問題。所以併發和並行對於思惟的要求是不同的,這也是咱們在面對問題時的兩種解決思路。併發