Python 執行緒和程序和協程總結

2022-01-23 02:08:30 字數 1439 閱讀 6633

具體使用參考

python 協程總結

優點

它是一種非常"節儉"的多工操作方式。我們知道,在linux系統下,啟動乙個新的程序必須分配給它獨立的位址空間,建立眾多的資料表來維護它的**段、堆疊段和資料段,這是一種"昂貴"的多工工作方式。而執行於乙個程序中的多個執行緒,它們彼此之間使用相同的位址空間,共享大部分資料,啟動乙個執行緒所花費的空間遠遠小於啟動乙個程序所花費的空間,而且,執行緒間彼此切換所需的時間也遠遠小於程序間切換所需要的時間。

執行緒間方便的通訊機制,對不同程序來說,它們具有獨立的資料空間,要進行資料的傳遞只能通過通訊的方式進行,這種方式不僅費時,而且很不方便。執行緒則不然,由於同一程序下的執行緒之間共享資料空間,所以乙個執行緒的資料可以直接為其它執行緒所用。

提高應用程式響應。這對圖形介面的程式尤其有意義,當乙個操作耗時很長時,整個系統都會等待這個操作,此時程式不會響應鍵盤、滑鼠、選單的操作,而使用多執行緒技術,將耗時長的操作(time consuming)置於乙個新的執行緒,可以避免這種尷尬的情況。

使多cpu系統更加有效。作業系統會保證當前執行緒數不大於cpu數目時,不同的執行緒執行於不同的cpu上。

全域性直譯器鎖是在實現python解析器(cpython)時所引入的乙個概念。每個執行緒在執行的過程都需要先獲取gil,保證同一時刻只有乙個執行緒可以執行**。

q&a

: 為什麼說gil對於cpu密集型任務不友好,而對於io密集型任務比較友好呢?

這是因為gil的釋放邏輯是當前執行緒遇見io操作或者ticks計數達到100(ticks可以看作是python自身的乙個計數器,專門做用於gil,每次釋放後歸零,這個計數可以通過 sys.setcheckinterval 來調整),進行釋放。而每次釋放gil鎖,執行緒進行鎖競爭、切換執行緒,會消耗資源。

解決方案

multiprocessing庫的出現很大程度上是為了彌補thread庫因為gil而低效的缺陷,它完整的複製了一套thread所提供的介面方便遷移。唯一的不同就是它使用了多程序而不是多執行緒。每個程序有自己的獨立的gil,因此也不會出現程序之間的gil爭搶。當然multiprocessing也不是萬能良藥。它的引入會增加程式實現時執行緒間資料通訊和同步的困難。

python的多執行緒在多核cpu上,只對於io密集型計算產生正面效果;而當至少有乙個cpu密集型執行緒存在時,那麼多執行緒效率會由於gil而大幅下降,這個時候就得使用多程序;

python中的多執行緒因為gil的關係並不算是真正的多執行緒,

如果想要充分地使用多核cpu的資源,大部分情況需要使用多程序。

multiprocessing支援子程序、通訊和共享資料、執行不同形式的同步,提供了process、queue、pipe、lock等元件。

談談python的gil、多執行緒、多程序

程序,執行緒和協程

程序 process 和執行緒 thread 是程式設計師必需掌握的核心知識。而多程序和多執行緒程式設計對於 的並行併發執行,提公升 效率和縮短執行時間至關重要。簡單總結 程序是資源分配的單位 執行緒是作業系統排程的單位 程序切換需要的資源很最大,效率很低 執行緒切換需要的資源一般,效率一般 當然了...

Python的執行緒 程序和協程

程序 乙個程序就是乙個正在執行的程式,它是計cpu分配資源的最小單位。每個程序都有自己獨立的記憶體空間。能同時執行的程序數最多不超過核心數,也就是每個核心 同一時刻只能執行乙個程序。那麼多程序就是能 同時 執行多個程序 比如同時聽 和寫 這裡的 同時 可以指cpu通過極快地在程序間來回切換來實現,所...

Python之執行緒 程序和協程

一 執行緒概念 執行緒 英語 thread 是作業系統能夠進行運算排程的最小單位。它被包含在程序之中,是程序中的實際運作單位。一條執行緒指的是程序中乙個單一順序的控制流,乙個程序中可以併發多個執行緒,每條執行緒並行執行不同的任務。二 python中線程的使用 usr bin env python c...