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