併發&並行&多線程&多進程&協程

並行(Parallelism)

並行是說同一時刻做很多操作。多進程是實現並行的有效方法。因爲它可以將許多任務分配到計算機的多個核心上。多進程很適合計算密集型的任務,因爲它充分地利用了多個CPU。

多進程(MultiProcessing)

根據上面敘述,多進程將多個任務分配到不同的cpu上,從而實現同一時刻,處理多個任務。它很適合計算密集的任務。
從上面的介紹也可以看出,如果計算機只有一個cpu,那麼多進程也是無法實現並行的

併發(Concurrency)

併發是比並行更加寬泛的概念,它指的是,多個任務可以交叉重疊進行。用一個例子來說明下併發和並行兩個概念。假設你開了一個餐館,只有一個廚師,但同時有兩桌客人點了菜。簡稱A桌和B桌,爲了讓兩桌客人都滿意,你可以安排廚師,交叉地爲兩桌客人做菜。爲A桌做一道菜,再爲B桌做一道菜,如此交叉進行,直到做完所有的菜。這個只能叫併發,不能叫並行。如果你多僱一個廚師,兩個廚師,一個做A桌的菜,一個做B桌的菜,這個就算並行了

多線程(Threading)

多線程是實現併發的一個手段。一個進程可以擁有多個線程。當有多個cpu時,多個線程是可以同時執行的,這時就是並行。如果只有一個cpu,那麼多個線程可以交叉重疊執行,這時就是併發了。

多進程和多線程比較起來,多線程一般適用於IO密集型的任務。多進程適用於計算密集型的任務

可能,你會有疑問,多線程既然可以並行執行,豈不是也適用於計算密集型的任務?理論上是這樣的,只是這裏說多進程更適合,是說當數據量比較大時,計算任務之間沒有邏輯上的依賴時,多進程更合適一些。因爲每個進程都會有自己的進程內存空間,各個進程之間天然隔離。而多線程共享同一個內存空間,線程之間的同步是必須考慮的問題。而這些問題都不是計算密集型任務必須的。所以我們說計算密集型任務更適合多進程

  • 在Thread和Process中,應當優選Process,因爲Process更穩定
  • 而且,Process可以分佈到多臺機器上,而Thread最多隻能分佈到同一臺機器的多個CPU上
  • 多進程會消耗系統較多的資源,系統支持的進程數也有限,雖然運行任務較穩定多線程的單個線程崩潰就會使整個進程崩潰,又有線程全局鎖

異步IO支持,就可以用單進程單線程模型來執行多任務,這種全新的模型稱爲事件驅動模型。

協程就是一個異步IO的支持模式。協程這種子程序,可以在執行的時候中斷,等需要耗時的操作執行完後發消息通知主線程,

然後再接着從剛纔中斷的地方繼續執行。這樣在任務間的切換是通過程序內部定義來控制的,也不需要線程鎖,執行效率高

協程是更加適合IO密集型任務的一種機制,因爲線程還需要線程切換的開銷,協程卻沒有
運用協程機制最典型的場景就是異步IO。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章