Python對多線程提供了很好的支持,Python中多線程相關的模塊包括:thread,threading,Queue。能夠方便地支持建立線程、互斥鎖、信號量、同步等特性。html
1. thread:多線程的底層支持模塊,除了其中提供的 Lock 原語外,通常不建議使用。python
2. threading:基於 thread 模塊,將一些線程的操做對象化,該模塊提供下列類:編程
Queue隊列多線程
LifoQueue後入先出(LIFO)隊列函數
PriorityQueue 優先隊列spa
Python線程系列包括如下部分:線程
第1篇——Thread對象htm
第2篇——經常使用的線程同步機制對象
第3篇——Queue模塊與線程編程blog
本文將介紹Python線程中的主角,threading.Thread 對象。
Thread in Python
1.1 Thread對象的建立
經過實例化Thread類型得到一個Thread對象:
threading.Thread(name=None, target=None, args=(), kwargs={})
參數的含義:
1.2 Thread對象的方法
t.getName()
返回線程當前的名字。
t.setName(name)
設置線程的名字,線程的名稱並不要求惟一。
t.isAlive()
判斷這個線程是否還在運行中(active)——已經調用了start() 而 run() 尚未執行結束。
t.isDaemon()
判斷線程是否是一個daemon線程,初始狀態下,線程 t1 只有在建立本身的線程 t0 是daemon時,本身才是daemon的。
t.setDaemon(daemonic)
把線程的daemon標誌設爲daemonic(真或假)
daemon 線程是指,即便這個線程 t 的狀態是 active,Python也能夠終止 t(多是經過終止 t 所在的進程);非daemon線程沒有終止前,Python會一直保持運行直到其終止。
setDaemon()須要在start()以前調用。
t.join(timeout=None)
這個函數須要注意,好比在一個線程 t1 的執行流程中調用 t2.join(),則 t1 阻塞直到 t2 線程執行結束,若是指定 timeout,則 t1 最多阻塞timeout秒,不然 t1 將一直等下去。
join()只能在start()以後調用;
t.run()
線程經過 run() 調用傳入的主函數 target,不要直接調用run(),而是調用start()函數,start()函數會調用run()。
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終止。