多執行緒與多程序的理解

2022-04-20 20:03:15 字數 1957 閱讀 5362

參考

執行緒是最小的執行單元,而程序由至少乙個執行緒組成。如何排程程序和執行緒,完全由作業系統決定,程式自己不能決定什麼時候執行,執行多長時間。

多程序和多執行緒的程式涉及到同步、資料共享的問題,編寫起來更複雜。

在unix/linux下,可以使用fork()呼叫實現多程序。

要實現跨平台的多程序,可以使用multiprocessing模組。

程序間通訊是通過queue、pipes等實現的

多執行緒和多程序最大的不同在於,多程序中,同乙個變數,各自有乙份拷貝存在於每個程序中,互不影響,而多執行緒中,所有變數都由所有執行緒共享,所以,任何乙個變數都可以被任何乙個執行緒修改,因此,執行緒之間共享資料最大的危險在於多個執行緒同時改乙個變數,把內容給改亂了。

因為python的執行緒雖然是真正的執行緒,但直譯器執行**時,有乙個gil鎖:global interpreter lock,任何python執行緒執行前,必須先獲得gil鎖,然後,每執行100條位元組碼,直譯器就自動釋放gil鎖,讓別的執行緒有機會執行。這個gil全域性鎖實際上把所有執行緒的執行**都給上了鎖,所以,多執行緒在python中只能交替執行,即使100個執行緒跑在100核cpu上,也只能用到1個核。

不過,也不用過於擔心,python雖然不能利用多執行緒實現多核任務,但可以通過多程序實現多核任務。多個python程序有各自獨立的gil鎖,互不影響。

小結多執行緒程式設計,模型複雜,容易發生衝突,必須用鎖加以隔離,同時,又要小心死鎖的發生。

python直譯器由於設計時有gil全域性鎖,導致了多執行緒無法利用多核。多執行緒的併發在python中就是乙個美麗的夢。

在多執行緒環境下,每個執行緒都有自己的資料。乙個執行緒使用自己的區域性變數比使用全域性變數好,因為區域性變數只有執行緒自己能看見,不會影響其他執行緒,而全域性變數的修改必須加鎖。

乙個threadlocal變數雖然是全域性變數,但每個執行緒都只能讀寫自己執行緒的獨立副本,互不干擾。threadlocal解決了引數在乙個執行緒中各個函式之間互相傳遞的問題

計算密集型 vs. io密集型

是否採用多工的第二個考慮是任務的型別。我們可以把任務分為計算密集型和io密集型。

計算密集型任務由於主要消耗cpu資源,因此,**執行效率至關重要。python這樣的指令碼語言執行效率很低,完全不適合計算密集型任務。對於計算密集型任務,最好用c語言編寫。

第二種任務的型別是io密集型,涉及到網路、磁碟io的任務都是io密集型任務,這類任務的特點是cpu消耗很少,任務的大部分時間都在等待io操作完成(因為io的速度遠遠低於cpu和記憶體的速度)。對於io密集型任務,任務越多,cpu效率越高,但也有乙個限度。常見的大部分任務都是io密集型任務,比如web應用。

io密集型任務執行期間,

99%的時間都花在io上,花在cpu上的時間很少,因此,用執行速度極快的c語言替換用python這樣執行速度極低的指令碼語言,完全無法提公升執行效率。對於io密集型任務,最合適的語言就是開發效率最高(**量最少)的語言,指令碼語言是首選,c語言最差。

非同步io

io密集型任務執行期間,

99%的時間都花在io上,花在cpu上的時間很少,因此,用執行速度極快的c語言替換用python這樣執行速度極低的指令碼語言,完全無法提公升執行效率。對於io密集型任務,最合適的語言就是開發效率最高(**量最少)的語言,指令碼語言是首選,c語言最差。

對應到python語言,單執行緒的非同步程式設計模型稱為協程,有了協程的支援,就可以基於事件驅動編寫高效的多工程式。我們會在後面討論如何編寫協程。

分布式程序

在thread和process中,應當優選process 因為process更為穩定,而且process可以分布到多台機器上,而thread最多只能分布到同一臺機器的多個cpu中

小結python的分布式程序介面簡單,封裝良好,適合需要把繁重任務分布到多台機器的環境下。

注意queue的作用是用來傳遞任務和接收結果,每個任務的描述資料量要盡量小。比如傳送乙個處理日誌檔案的任務,就不要傳送幾百兆的日誌檔案本身,而是傳送日誌檔案存放的完整路徑,由worker程序再去共享的磁碟上讀取檔案

多執行緒與多程序

程序 程序是程式的一次執行,在傳統的計算機中,程序既是基本的分配單元,也是基本的執行單元。執行緒 執行緒是可執行的實體單元,它是處理機排程的基本單位。由於執行緒在同一位址空間,因此建立和撤銷執行緒的開銷小,執行緒間的通訊效率高,切換迅速。在多處理機系統中,對程序的個數有所限制,但對執行緒的個數不存在...

多執行緒與多程序

魚還是熊掌 多程序多執行緒的選擇 關於多程序和多執行緒,教科書上最經典的一句話是 程序是資源分配的最小單位,執行緒是cpu排程的最小單位 這句話應付考試基本上夠了,但如果在工作中遇到類似的選擇問題,那就沒有這麼簡單了,選的不好,會讓你深受其害。經常在網路上看到有的xdjm問 多程序好還是多執行緒好?...

多程序與多執行緒

import threading建立乙個執行緒,指向的函式,不接收引數的情況 t threading.thread target 函式名 建立乙個執行緒,指向的函式,收引數的情況 t threading.thread target 函式名,args 實參1,執行緒物件名.start 生命週期 我們的...