python執行緒join的正解
阿新 • • 發佈:2018-12-23
幾個事實
1 python 預設引數建立執行緒後,不管主執行緒是否執行完畢,都會等待子執行緒執行完畢才一起退出,有無join結果一樣
2 如果建立執行緒,並且設定了daemon為true,即thread.setDaemon(True), 則主執行緒執行完畢後自動退出,不會等待子執行緒的執行結果。而且隨著主執行緒退出,子執行緒也消亡。
3 join方法的作用是阻塞,等待子執行緒結束,join方法有一個引數是timeout,即如果主執行緒等待timeout,子執行緒還沒有結束,則主執行緒強制結束子執行緒。
4 如果執行緒daemon屬性為False, 則join裡的timeout引數無效。主執行緒會一直等待子執行緒結束。
5 如果執行緒daemon屬性為True, 則join裡的timeout引數是有效的, 主執行緒會等待timeout時間後,結束子執行緒。此處有一個坑,即如果同時有N個子執行緒join(timeout),那麼實際上主執行緒會等待的超時時間最長為 N * timeout, 因為每個子執行緒的超時開始時刻是上一個子執行緒超時結束的時刻。
測試程式碼和執行結果:
import threading, time def doThreadTest(): print 'start thread time:', time.strftime('%H:%M:%S') time.sleep(10) print 'stop thread time:', time.strftime('%H:%M:%S') threads = [] for i in range(3): thread1 = threading.Thread(target = doThreadTest) thread1.setDaemon(True) threads.append(thread1) for t in threads: t.start() for t in threads: t.join(1) print 'stop main thread'
如果把 thread1.setDaemon(True) 註釋掉, 執行結果為