Python多執行緒(1)——介紹
轉自:http://www.cnblogs.com/Security-Darren/p/4732842.html
Python對多執行緒提供了很好的支援,Python中多執行緒相關的模組包括:thread,threading,Queue。可以方便地支援建立執行緒、互斥鎖、訊號量、同步等特性。
1. thread:多執行緒的底層支援模組,除了其中提供的 Lock 原語外,一般不建議使用。
2. threading:基於 thread 模組,將一些執行緒的操作物件化,該模組提供下列類:
-
- Thread,執行緒類
- Timer,與Thread類似,但要等待一段時間後才開始執行
- Lock,鎖原語,和 thread 模組提供的 Lock 相同
- RLock,可重入鎖。使單執行緒可以再次獲得已經獲得的鎖
- Condition,條件變數,能讓一個執行緒停下來,等待其他執行緒滿足某個“條件”
- Event,通用的條件變數。多個執行緒可以等待某個事件發生,在事件發生後,所有的執行緒都被啟用
- Semaphore,為等待鎖的執行緒提供一個類似“等候室”的結構
-
Queue佇列
-
LifoQueue後入先出(LIFO)佇列
-
PriorityQueue 優先佇列
Python執行緒系列包括以下部分:
本文將介紹Python執行緒中的主角,threading.Thread 物件。
Thread in Python
1.1 Thread物件的建立
通過例項化Thread型別獲得一個Thread物件:
1 |
threading.Thread(name = None ,
target = None ,
args = (),
kwargs = {})
|
引數的含義:
- name:新執行緒的名稱,如果沒有指定,python會為其生成一個隨機的唯一名稱;
- target:新執行緒中將要執行的函式;t.run() 會呼叫 target(*args, **kwargs)
- args和kwargs:這是傳遞給執行緒中執行的主函式 target 的引數,當執行緒開始執行時,將會以這些引數呼叫執行主函式 target()。
1.2 Thread物件的方法
1 |
t.getName()
|
返回執行緒當前的名字。
1 |
t.setName(name)
|
設定執行緒的名字,執行緒的名稱並不要求唯一。
1 |
t.isAlive()
|
判斷這個執行緒是否還在執行中(active)——已經呼叫了start() 而 run() 還沒有執行結束。
1 |
t.isDaemon()
|
判斷執行緒是不是一個daemon執行緒,初始狀態下,執行緒 t1 只有在建立自己的執行緒 t0 是daemon時,自己才是daemon的。
1 |
t.setDaemon(daemonic)
|
把執行緒的daemon標誌設為daemonic(真或假)
daemon 執行緒是指,即使這個執行緒 t 的狀態是 active,Python也可以終止 t(可能是通過終止 t 所在的程序);非daemon執行緒沒有終止前,Python會一直保持執行直到其終止。
setDaemon()需要在start()之前呼叫。
1 |
t.join(timeout = None )
|
這個函式需要注意,比如在一個執行緒 t1 的執行流程中呼叫 t2.join(),則 t1 阻塞直到 t2 執行緒執行結束,如果指定 timeout,則 t1 最多阻塞timeout秒,否則 t1 將一直等下去。
join()只能在start()之後呼叫;
1 |
t.run()
|
執行緒通過 run() 呼叫傳入的主函式 target,不要直接呼叫run(),而是呼叫start()函式,start()函式會呼叫run()。
1 |
t.start()
|
開始執行緒執行
Python執行緒執行的流程
1. 建立一個執行緒 t= threading.Thread(),此時新建立的執行緒並不會立即執行;
2. 如果想要將 t 設定為守護執行緒,在呼叫 t.start() 之前呼叫 t.setDaemon(True);否則忽略本步;
3. 呼叫 t.start(),此時執行緒開始執行,狀態更新為 active。更具體的,start() 會進一步呼叫 run() 函式,run() 函式再去呼叫建立執行緒物件時傳入的主函式 target,從而讓執行緒有了執行的具體內容;
4. 當執行緒中的主函式執行完成或遇到未處理的異常時,執行緒終止執行;daemon執行緒也可能因為所在程序終止而被Python終止。