併發(concurrency):併發的關鍵在於有處理多個任務的能力,但並不必定就是同時處理.java
例1: 吃飯時,電話響起,暫時停下吃飯的動做,接完電話後繼續吃飯.多線程
例2: 一我的吃3個饅頭併發
並行(parallelism):並行的關鍵在於同時處理多個任務app
例子1: 吃飯時,電話響起,同時進行吃飯和電話2個動做異步
例子2: 三我的吃3個饅頭async
即便不看詳細解釋,也請記住這句話.函數
這個概念很好理解。所謂並行,就是同時執行的意思,無需過分解讀。判斷程序是否處於並行的狀態,就看同一時刻是否有超過一個「工做單位」在運行就行了。因此,單線程永遠沒法達到並行狀態。線程
要達到並行狀態,最簡單的就是利用多線程
和多進程
。設計
注意: Python 的多線程因爲存在著名的 GIL(通俗理解爲就是一把全局排他鎖
),沒法讓兩個線程真正「同時運行」,因此其實是沒法到達並行狀態的。3d
要理解「併發」這個概念,必須得清楚,併發指的是程序的「結構」。當咱們說這個程序是併發的,實際上,這句話應當表述成「這個程序採用了支持併發的設計」。好,既然併發指的是人爲設計的結構,那麼怎樣的程序結構才叫作支持併發的設計?
正確的併發設計的標準是:兩個任務能夠在重疊的時間段內啓動、運行和完成(two tasks can start, run, and complete in overlapping time periods)。
是不是同時處理多個任務
同步和異步關注的是消息通訊機制 (synchronous communication/ asynchronous communication)
阻塞和非阻塞關注的是程序在等待調用結果(消息,返回值)時的狀態.
「阻塞」與"非阻塞" 與 "同步"與「異步"不能簡單的從字面理解
前者關注的是等待結果時的狀態,後者關注的是通訊機制
關注公衆號:java寶典