那些年讓你迷惑的並行、併發、多線程、多進程、協程

認真把這些概念的關係梳理清楚,絕對是一件打根基的好事。作為自學計算機的人,越早明白這些基本概念,就越能提高自己的自學速度。

1、並行(Parallelism)

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

2、多進程(MultiProcessing)

多進程是實現並行的一個有效手段。它可以充分發揮多個cpu的作用,將多個任務分配到不同的cpu上,從而實現同一時刻,處理多個任務。它很適合計算密集的任務,因為它充分利用了多個cpu。

從上面的介紹也可以看出,如果計算機只有一個cpu,那麼多進程也是無法實現並行的。

3、併發(Concurrency)

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

4、多線程(Threading)

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

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

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

5、 協程(Coroutine)

有了以上四個部分的介紹,是時候引入協程的概念了。簡單講,協程是另一種實現併發的手段,這裡的併發,特指不是並行的併發。

通過第4部分的介紹,我們看到線程也是可以實現這種非並行的併發的,從這一點上看,協程和線程更像一點。

但是,協程卻是用單進程,單線程的方式來實現的。

之前提到過,多線程適合IO密集型任務,但這裡要提出的是,協程是更加適合IO密集型任務的一種機制,因為線程還需要線程切換的開銷,協程卻沒有。

運用協程機制最典型的場景就是異步IO。

所謂異步,是指一段程序在執行完成前有能力“暫停”,讓其他程序段執行。

如果你對異步IO有疑惑,請參考這篇文章。

https://zhuanlan.zhihu.com/p/47311345

6、無總結不進步

協程的出現,可以說是解決IO密集型任務時,比線程更加輕量的解決方案,本文從和協程的相關的概念分析中,闡述清楚了協程在併發編程的位置。希望對大家理解協程有一點幫助。最後,用一張圖總結下本文:

那些年讓你迷惑的並行、併發、多線程、多進程、協程


分享到:


相關文章: