原文鏈接:并發與并行的區別
現在我們都說設計可并行、高并發的程式,而且我們很多時候會在潛意識里覺得自己對并行(Parallelism)和并發(Concurrency)的區別很清楚,但如果要明確的說出二者的區別,又感覺沒辦法給出一個非常清晰的描述,
那么什么是并發?什么又是并行呢?并行的概念比較簡單,并行總是和執行(executions)相關,很多東西同時執行就是并行;而并發則是通過一些方式組織你的程式,讓它可以分成多個模塊去獨立的執行,并行必然是需要多核的,一個處理器是無法并行的;但并發和處理器并沒有什么必然聯系,在一個處理器上面,我們的程式也可以是并發的,
舉個簡單的例子,華羅庚泡茶,必須有燒水、洗杯子、拿茶葉等步驟,現在我們想盡快做完這件事,也就是“一共要處理很多事情”,有很多方法可以實作并發,例如請多個人同時做,這就是并行,并行是實作并發的一種方式,但不是唯一的方式,我們一個人也可以實作并發,例如先燒水、然后不用等水燒開就去洗杯子,所以通過調整程式運行方式也可以實作并發,
如果你覺得以上的講解還是太抽象了,下面通過一個小故事來講解,故事原型來自 Go 語言創始人之一 Rob Pike 的一篇演講,
故事的開始有一個需求:有一群地鼠要把一堆廢棄的說明書用小推車推到火爐去啥訓,
剛開始只有一只地鼠,使用一輛推車,將書裝到車上,運輸到火爐旁,將書卸到火爐,完成任務必然需要比較長的時間,

此時如果再增加一只地鼠,那也沒什么用,因為一只地鼠在干活,另一只地鼠只能等待,(當然有人說兩只地鼠輪流使用一輛推車,這樣可以讓地鼠得到休息,這樣它們干活更快,也可以提高效率,)

再找一輛推車來,兩只地鼠分別使用各自的推車,將書裝到車上,運輸到火爐旁,將書卸到火爐,這樣會提高運輸效率,但它們會在裝書和卸書時進行排隊,降低了效率,

這樣雖然比之前快了,但還是有瓶頸的,因為書只有一堆,火爐也只有一個,所以我們還必須通過訊息來協調兩只地鼠的行動,好吧,那我們再把書分成兩堆,再增加一個火爐,

這樣就比之前的效率高差不多一倍了,現在這個模型就是并發的,因為兩只地鼠可以獨立完成一件事了,這樣提高了運輸效率,而且在裝書和卸書時不會進行排隊,提高了裝卸的效率,但這個模型不一定是并行的,比如同一時刻可能只有一只地鼠在干活,
上面就是第一種并發模型,我們還可以設計更多的并發模型,繼續看漫畫,
這次找了 3 只地鼠,一只負責把書裝到車上,一只負責運輸,一只負責把書卸到火爐焚燒,每只地鼠做一個獨立的任務,當然三只地鼠之間需要使用一些諸如訊息通信之類的手段進行協調,

裝書和燒書的兩只地鼠都很輕松,負責運輸的這只地鼠卻很累,系統出現了瓶頸,那我們再找一只地鼠來,專門負責運回空推車,

我們在一個已有的設計(指三個地鼠的那個設計)中添加一個并發的步驟(第四只地鼠)增強了系統的性能,這樣一來,兩只地鼠去搞運輸,如果協調的好,理論情況下作業效率將是一只地鼠的 4 倍,
總共有 4 個并發的步驟:
- 把書裝到車上;
- 把推車運到火爐旁;
- 把書卸到火爐里;
- 運回空推車,
可以再增加一個分組,將這個并發模型并行化,

下面我們再來看另外一種并發模型,負責運輸的地鼠抱怨說運輸路程太長,那我們就增加一個中轉站,

然后再增加一個分組,將這個并發模型并行化,兩個分組并行執行,

可以把上面的并發模型再改進一下,增加中轉站的同時,再增加兩只地鼠,一只負責將從書堆運過來的書卸到中轉站,另一只負責將書從中轉站裝到推車里,再讓后面的地鼠運輸到火爐旁,

然后再增加一個分組,將這個并發模型并行化,

漫畫到這里就結束了,總共介紹了三種并發模型,每種模型都可以很容易地并行化,可以看到上面的并發模型每改進一次,其實就是將任務拆的更細了,一旦分解了問題,并發就自然而然產生了,每個人只專注于一個任務,
回到程式中,書就代表著資料,地鼠就是 CPU,而車可能就是序列化、反序列化、網路等設施,火爐就是代理、瀏覽器或其他的消費者,而上面的并發模型就是一個可擴展的 Web Service,
該演講題目為《Concurrency is not Parallelism》,原文鏈接:
- 演講幻燈片:https://talks.golang.org/2012/waza.slide
- 演講視頻:https://www.youtube.com/watch?v=cN_DpYBzKso&t=550s
參考鏈接
- https://my.oschina.net/3233123/blog/1047239
- https://blog.csdn.net/claram/article/details/52094587
微信公眾號
掃一掃下面的二維碼關注微信公眾號,在公眾號中回復?加群?即可加入我們的云原生交流群,和孫宏亮、張館長、陽明等大佬一起探討云原生技術

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/57265.html
標籤:其他
