淺談Python中threading join和setDaemon用法及區別說明
Python多執行緒程式設計時,經常會用到join()和setDaemon()方法,今天特地研究了一下兩者的區別。
1、join ()方法:主執行緒A中,建立了子執行緒B,並且在主執行緒A中呼叫了B.join(),那麼,主執行緒A會在呼叫的地方等待,直到子執行緒B完成操作後,才可以接著往下執行,那麼在呼叫這個執行緒時可以使用被呼叫執行緒的join方法。
原型:join([timeout])
裡面的引數時可選的,代表執行緒執行的最大時間,即如果超過這個時間,不管這個此執行緒有沒有執行完畢都會被回收,然後主執行緒或函式都會接著執行的。
例子:
import threading import time class MyThread(threading.Thread): def __init__(self,id): threading.Thread.__init__(self) self.id = id def run(self): x = 0 time.sleep(10) print self.id if __name__ == "__main__": t1=MyThread(999) t1.start() for i in range(5): print I
執行後的結果是:
0
1
2
3
4
999
機器上執行時,4和999之間,有明顯的停頓。
解釋:
執行緒t1 start後,主執行緒並沒有等執行緒t1執行結束後再執行,而是先把5次迴圈列印執行完畢(列印到4),然後sleep(10)後,執行緒t1把傳進去的999才打印出來。
現在,我們把join()方法加進去(其他程式碼不變),看看有什麼不一樣,例子:
import threading import time class MyThread(threading.Thread): def __init__(self,id): threading.Thread.__init__(self) self.id = id def run(self): x = 0 time.sleep(10) print self.id if __name__ == "__main__": t1=MyThread(999) t1.start() t1.join() for i in range(5): print I
執行後的結果是:
999
0
1
2
3
4
機器上執行時,999之前,有明顯的停頓。
解釋:
執行緒t1 start後,主執行緒停在了join()方法處,等sleep(10)後,執行緒t1操作結束被join,接著,主執行緒繼續迴圈列印。
2、setDaemon()方法。主執行緒A中,建立了子執行緒B,並且在主執行緒A中呼叫了B.setDaemon(),這個的意思是,把主執行緒A設定為守護執行緒,這時候,要是主執行緒A執行結束了,就不管子執行緒B是否完成,一併和主執行緒A退出.這就是setDaemon方法的含義,這基本和join是相反的。此外,還有個要特別注意的:必須在start() 方法呼叫之前設定,如果不設定為守護執行緒,程式會被無限掛起。
例子:就是設定子執行緒隨主執行緒的結束而結束:
import threading import time class MyThread(threading.Thread): def __init__(self,id): threading.Thread.__init__(self) def run(self): time.sleep(5) print "This is " + self.getName() if __name__ == "__main__": t1=MyThread(999) t1.setDaemon(True) t1.start() print "I am the father thread."
執行後的結果是:
I am the father thread.
可以看出,子執行緒t1中的內容並未打出。
解釋:t1.setDaemon(True)的操作,將父執行緒設定為了守護執行緒。根據setDaemon()方法的含義,父執行緒列印內容後便結束了,不管子執行緒是否執行完畢了。
程式執行中,執行一個主執行緒,如果主執行緒又建立一個子執行緒,主執行緒和子執行緒就分兵兩路,分別執行,那麼當主執行緒完成想退出時,會檢驗子執行緒是否完成。
如果子執行緒未完成,則主執行緒會等待子執行緒完成後再退出。
但是有時候我們需要的是,只要主執行緒完成了,不管子執行緒是否完成,都要和主執行緒一起退出,這時就可以用setDaemon方法了。
所以,join和setDaemon的區別如上述的例子,它們基本是相反的。
以上這篇淺談Python中threading join和setDaemon用法及區別說明就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。