并发 vs 并行 (Concurrency Is Not Parallelism)
前言
不知你是否曾經(jīng)下列這些疑問(wèn)?
- 并發(fā)與并行性有何關(guān)系?
- 什么是同步和異步執(zhí)行?
- 如何區(qū)分并發(fā)與并行?
- 線程如何與所有這些概念一起使用?
并發(fā)
并發(fā)性意味著應(yīng)用程序同時(shí)(并發(fā)地)在多個(gè)任務(wù)上取得進(jìn)展(is making progress )。好吧,如果計(jì)算機(jī)只有一個(gè)CPU,那么應(yīng)用程序可能不會(huì)在同一時(shí)間對(duì)多個(gè)任務(wù)進(jìn)行處理,但是在應(yīng)用程序內(nèi)部,同時(shí)處理多個(gè)任務(wù)。在開始下一個(gè)任務(wù)之前,它不會(huì)完全完成一個(gè)任務(wù)。
讓我們舉個(gè)現(xiàn)實(shí)生活中的例子:有個(gè)挑戰(zhàn)要求你既要吃掉一整塊蛋糕,又要唱一整首歌。如果你是最快唱完整首歌并完成蛋糕的人,你就贏了。所以規(guī)則是你一邊唱歌一邊吃東西,你可以吃掉整個(gè)蛋糕,然后唱整首歌,或者你可以吃掉半個(gè)蛋糕,然后唱半首歌,然后再唱一遍,等等。
并發(fā)性意味著同時(shí)執(zhí)行多個(gè)任務(wù),但不一定是同時(shí)執(zhí)行。有兩個(gè)任務(wù)同時(shí)執(zhí)行,但它們是在一個(gè)單核CPU中運(yùn)行的,所以CPU會(huì)決定先運(yùn)行一個(gè)任務(wù)再運(yùn)行另一個(gè)任務(wù),或者先運(yùn)行一半任務(wù)再運(yùn)行另一半任務(wù)等等。兩個(gè)任務(wù)可以在重疊的時(shí)間段中啟動(dòng)、運(yùn)行和完成,任務(wù)2甚至可以在任務(wù)1完成之前開始。這完全取決于系統(tǒng)架構(gòu)。
并行
并行是指應(yīng)用程序?qū)⑵淙蝿?wù)分解為較小的子任務(wù),這些子任務(wù)可以并行處理,例如在多個(gè)CPU上同時(shí)進(jìn)行。
并行不要求存在兩個(gè)任務(wù)。它實(shí)際上是通過(guò)使用CPU的多核基礎(chǔ)結(jié)構(gòu),通過(guò)為每個(gè)任務(wù)或子任務(wù)分配一個(gè)內(nèi)核來(lái)同時(shí)實(shí)際運(yùn)行部分任務(wù)或多個(gè)任務(wù)。
如果我們繼續(xù)上面的示例,則規(guī)則仍然是同時(shí)唱歌和吃飯,但是這次,你要兩個(gè)人一起比賽。你可能會(huì)吃東西,然后讓你的朋友唱歌(因?yàn)樗韪?#xff0c;你吃得更好)。所以這一次,這兩個(gè)任務(wù)實(shí)際上是同時(shí)執(zhí)行的,稱為并行。
并行性本質(zhì)上要求具有多個(gè)處理單元的硬件。**在單核CPU中,您可能會(huì)獲得并發(fā)性,但不能并行化。**并行是一種特定類型的并發(fā),其中的任務(wù)實(shí)際上是同時(shí)執(zhí)行的。
并發(fā)和并行的區(qū)別是什么?
在《The Art of Concurrency 》一書中介紹說(shuō)兩者的區(qū)別是:
A system is said to be concurrent if it can support two or more actions in progress at the same time. A system is said to be parallel if it can support two or more actions executing simultaneously.
翻譯過(guò)來(lái)就是
如果一個(gè)系統(tǒng)能夠同時(shí)支持兩個(gè)或多個(gè)正在進(jìn)行的操作,則稱為并發(fā)系統(tǒng)。如果一個(gè)系統(tǒng)能夠支持兩個(gè)或多個(gè)同時(shí)執(zhí)行的操作,則稱為并行系統(tǒng)。
這里面有一個(gè)關(guān)鍵詞就是in progress即正在進(jìn)行。這個(gè)定義是說(shuō),在并發(fā)系統(tǒng)中多個(gè)操作可以同時(shí)進(jìn)行(可能不會(huì)執(zhí)行)。同時(shí),多個(gè)操作在并行系統(tǒng)中同時(shí)執(zhí)行。事實(shí)上,并發(fā)性和并行性在概念上在某種程度上是重疊的,但在**進(jìn)行中(in process)**顯然使它們不同。
Concurrency is about dealing with lots of things at once. Parallelism is about doing lots of things at once.
并發(fā)是指同時(shí)處理許多事情。并行性是指同時(shí)做很多事情。
關(guān)于并發(fā)的形象例子
你和你的心上人去肯德基吃漢堡,你們分別點(diǎn)了一個(gè)漢堡,付完錢之后,服務(wù)員給了你一個(gè)號(hào),然后你就和你的心上人找了一個(gè)桌子坐下來(lái)了,然后你們開始談情說(shuō)愛,這個(gè)時(shí)候肯德基在為你準(zhǔn)備著你的漢堡,這時(shí)候你們一邊等著肯德基服務(wù)員的叫號(hào),一邊繼續(xù)談情說(shuō)愛,正談到高興的時(shí)候,叫到你們的號(hào)了,你沒(méi)有立刻去取餐,因?yàn)槟阒绖e人沒(méi)有你的號(hào),不會(huì)將你的餐取走,所以等到聊完了,你慢悠悠的去取餐,然后你們一起開心的吃漢堡。
這個(gè)你一邊等著肯德基的號(hào),一邊和心上人聊天的過(guò)程就是并發(fā)的,你等待取餐和肯德基制作漢堡是異步的(asynchronous ),你在等待的時(shí)候還在干其他的事——和你的心上人彈琴說(shuō)愛,你在同時(shí)處理許多事情。
關(guān)于并行的形象例子:
你和你的心上人去買奶茶,總共有3個(gè)窗口可以點(diǎn)奶茶,每個(gè)點(diǎn)餐服務(wù)員同時(shí)也是制作奶茶的服務(wù)員,所以沒(méi)有“取號(hào)”的機(jī)制,所以你只能排隊(duì)等在隊(duì)伍前面的人付款-等待-取完奶茶之后再下單,終于等到你們了,在下單-付款之后,店員去廚房給你們做好奶茶,你們也只能在柜臺(tái)前面等待著,這樣可以保障別人不會(huì)將你們的奶茶拿走,由于你和你的心上人忙于不讓任何人站在你們面前并在奶茶完成時(shí)候帶走你們的奶茶,所以你們無(wú)心“談情說(shuō)愛”。然后經(jīng)過(guò)漫長(zhǎng)時(shí)間的等待,你們的奶茶終于做好了,你們拿起奶茶,然后你們喝了奶茶就好了。
在這個(gè)過(guò)程中你和你的心上人都在等待并且將你們的注意力長(zhǎng)時(shí)間花在“在柜臺(tái)上等待”,這是同步工作,您與收銀員/廚師o(wú)k?**“同步”**,你的等待和廚師的制作奶茶同步。雖然有3個(gè)窗口可以點(diǎn)奶茶,他們并行的為消費(fèi)者提供服務(wù),雖然你們?nèi)〉侥滩璧臅r(shí)間未必很長(zhǎng),但是你們一直都在等待,想必這一定影響你和你心上人的體驗(yàn)。
是否并發(fā)一定比并行好?
并發(fā)不同于并行。在涉及大量等待的特定情況下,并發(fā)效果更好。因此,對(duì)于Web應(yīng)用程序開發(fā),它通常比并行性好得多。但并非所有的情況都是這樣的。
總結(jié)
- 一個(gè)應(yīng)用程序可以是并發(fā)的,但不是并行的,這意味著它可以同時(shí)處理多個(gè)任務(wù),但是沒(méi)有兩個(gè)任務(wù)可以同時(shí)執(zhí)行。
- 一個(gè)應(yīng)用程序可以是并行的,但不是并發(fā)的,這意味著它可以同時(shí)處理多核CPU中一個(gè)任務(wù)的多個(gè)子任務(wù)。
- 應(yīng)用程序既不能是并行的,也不是并發(fā)的,這意味著它一次順序地處理所有任務(wù)。
- 一個(gè)應(yīng)用程序既是并行的,也是并發(fā)的,這意味著它可以同時(shí)在多核CPU中同時(shí)處理多個(gè)任務(wù)。
參考
Concurrency vs. Parallelism — A brief view
FastApi Asynchronous Code
總結(jié)
以上是生活随笔為你收集整理的并发 vs 并行 (Concurrency Is Not Parallelism)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 阿里巴巴图学习框架 euler 安装运行
- 下一篇: 快速给shell脚本加上使用提示