文章目錄
前面介紹過多線程的基本概念,理解了這些基本概念,掌握python多線程編程就比較容易了。
在開始之前,首先要瞭解一下python對多線程的支援。
虛擬機器層面
Python虛擬機器使用GIL(Global Interpreter Lock,全域解譯器鎖)來互斥線程對共用資源的訪問,暫時無法利用多處理器的優勢。
語言層面
在語言層面,Python對多線程提供了很好的支援,Python中多線程相關的模組包括:thread,threading,Queue。可以方便地支援建立線程、互斥鎖、訊號量、同步等特性。
thread:多線程的底層支援模組,一般不建議使用。
threading:對thread進行了封裝,將一些線程的操作對象化,提供下列類:
Thread 線程類
Timer與Thread類似,但要等待一段時間後才開始運行
Lock 鎖原語
RLock 可重新進入鎖。使單線程可以再次獲得已經獲得的鎖
Condition 條件變數,能讓一個線程停下來,等待其他線程滿足某個“條件”
Event 通用的條件變數。多個線程可以等待某個事件發生,在事件發生後,所有的線程都被啟用
Semaphore為等待鎖的線程提供一個類似“等候室”的結構
BoundedSemaphore 與semaphore類似,但不允許超過初始值
Queue:實現了多生產者(Producer)、多消費者(Consumer)的隊列,支援鎖原語,能夠在多個線程之間提供很好的同步支援。提供的類:
Queue隊列
LifoQueue後入先出(LIFO)隊列
PriorityQueue 優先隊列
其中Thread類是你主要的線程類,可以建立進程執行個體。該類提供的函數包括:
getName(self) 返回線程的名字
isAlive(self) 布爾標誌,表示這個線程是否還在運行中
isDaemon(self) 返回線程的daemon標誌
join(self, timeout=None) 程式掛起,直到線程結束,如果給出timeout,則最多阻塞timeout秒
run(self) 定義線程的功能函數
setDaemon(self, daemonic) 把線程的daemon標誌設為daemonic
setName(self, name) 設定線程的名字
start(self) 開始線程執行
第三方支援
如果你特別在意效能,還可以考慮一些“微線程”的實現:
Stackless Python:Python的一個增強版本,提供了對微線程的支援。微線程是輕量級的線程,在多個線程間切換所需的時間更多,佔用資源也更少。
greenlet:是 Stackless 的副產品,其將微線程稱為 “tasklet” 。tasklet運行在偽並發中,使用channel進行同步資料交換。而”greenlet”是更加原始的微線程的概念,沒有調度。你可以自己構造微線程的調度器,也可以使用greenlet實現進階的控制流程。
下一節,將開始用python建立和啟動線程。