執行緒與行程

執行緒與進程是作業系統裡面的術語,簡單來講,每個應用程式都有一個自己的行程。

作業系統會為這些行程分配一些執行資源,例如記憶體空間等。在進程中,又可以創建一些線程,他們共享這些記憶體空間,並由作業系統調用,以便並行計算。

我們都知道現代作業系統像是 Mac OS X,UNIX,Linux,Windows 等可以同時執行多個任務。打個比方,你一邊在用瀏覽器上網,一邊在聽敲代碼,一邊用 Markdown 寫博客,這就是多任務,至少同時有 3 個任務正在運行。當然還有很多任務悄悄地在後台同時運行著,只是桌面上沒有顯示而已。對作業系統來說,一個任務就是一個進程(Process),例如開啟一個瀏覽器就是啟動一個瀏覽器進程,開啟 PyCharm 就是一個啟動了一個 PtCharm 進程,而開啟 Markdown 就是啟動了一個 Md 的進程。

雖然現在多核心 CPU 已經非常普及了。可是由於 CPU 執行程式碼都是順序執行的,這時候我們就會有疑問,單核心 CPU 是怎麼執行多任務的呢?

其實就是作業系統輪流讓各個任務交替執行,任務1 執行0.01 秒,切換到任務2 ,任務2 執行0.01 秒,再切換到任務3 ,執行0.01秒…這樣反复執行下去。表面上看,每個任務都是交替執行的,但是,由於 CPU的執行速度實在是太快了,我們肉眼和感覺上沒辦法識別出來,就像所有任務都在同時執行一樣。

真正的平行執行多任務只能在多核心CPU 上實現,但是,由於任務數量遠遠多於CPU 的核心數量,所以,作業系統也會自動把很多任務輪流調度到每個核心上執行。

有些進程不只是乾一件事的啊,比如瀏覽器,我們可以播放時視頻,播放音頻,看文章,編輯文章等等,其實這些都是在瀏覽器進程中的子任務。在一個進程內部,要同時幹多件事,就需要同時運行多個“子任務”,我們把進程內的這些“子任務”稱為線程(Thread)。

由於每個行程至少要做一件事,所以,一個行程至少有一個執行緒。當然,一個行程也可以有多個線程,多個線程可以同時執行,多線程的執行方式和多進程是一樣的,也是由作業系統在多個線程之間快速切換,讓每個線程都短暫地交替運行,看起來就像同時執行一樣。

那麼在 Python 中我們要同時執行多個任務怎麼辦?

有兩種解決方案:

一種是啟動多個進程,每個進程雖然只有一個線程,但多個進程可以一塊執行多個任務。

還有一個方法是啟動一個行程,在一個行程內啟動多個線程,這樣,多個執行緒也可以一塊執行多個任務。

當然還有第三種方法,就是啟動多個進程,每個進程再啟動多個線程,這樣同時執行的任務就更多了,當然這種模型更複雜,實際上很少採用。

總結一下就是,多任務的實作有3種方式:

多進程模式;

多執行緒模式;

多行程多執行緒模式。

同時執行多個任務通常各個任務之間並不是沒有關聯的,而是需要相互溝通和協調,有時,任務1 必須暫停等待任務2 完成後才能繼續執行,有時,任務3 和任務4 又不能同時執行,所以,多行程和多執行緒的程式的複雜度要遠高於我們前面寫的單一行程單執行緒的程式。

因為複雜度高,調試困難,所以,不是迫不得已,我們也不想寫多任務。但是,有很多時候,沒有多工還真不行。想想在電腦上看電影,就必須由一個線程播放視頻,另一個線程播放音頻,否則,單線程實現的話就只能先把視頻播放完再播放音頻,或者先把音頻播放完再播放視頻,這顯然是不行的。

繼續學習