python的多線程中的join的作用
阿新 • • 發佈:2018-08-22
mar python ima blog star img 結束 nag 技術分享 1 python 默認參數創建線程後,不管主線程是否執行完畢,都會等待子線程執行完畢才一起退出,有無join結果一樣
例子如下:
例子如下:
例子如下:
①.主線程超時時間小於子線程運行時間,主線程結束了,不管子線程是否結束都結束了
例子如下:
import threading import time def say(name): print(‘%s is start ‘ % name) time.sleep(3) print(‘%s is stop‘%name) print(‘___主線程開始___‘,time.time()) t = threading.Thread(target=say,args=(‘eve‘,)) t.start() t.join() print(‘___主線程結束___‘,time.time())
import threading
import time
def say(name):
print(‘%s is start ‘ % name)
time.sleep(3)
print(‘%s is stop‘%name)
print(‘___主線程開始___‘,time.time())
t = threading.Thread(target=say,args=(‘eve‘,))
t.start()
#t.join()
print(‘___主線程結束___‘,time.time())
2 如果創建線程,並且設置了daemon為true,即thread.setDaemon(True), 則主線程執行完畢後自動退出,不會等待子線程的執行結果。而且隨著主線程退出,子線程也消亡。
import threading
import time
def say(name):
print(‘%s is start ‘ % name)
time.sleep(3)
print(‘%s is stop‘%name)
print(‘___主線程開始___‘)
t = threading.Thread(target=say,args=(‘eve‘,))
t.setDaemon(True)
t.start()
# t.join()
print(‘___主線程結束___‘)
3 join方法的作用是阻塞,等待子線程結束,join方法有一個參數是timeout,即如果主線程等待timeout,子線程還沒有結束,則主線程強制結束子線程。
①.主線程超時時間小於子線程運行時間,主線程結束了,不管子線程是否結束都結束了
import threading
import time
def say(name):
print(‘%s is start ‘ % name)
time.sleep(3)
print(‘%s is stop‘%name)
print(‘___主線程開始___‘)
t = threading.Thread(target=say,args=(‘eve‘,))
t.setDaemon(True)
t.start()
t.join(2)
print(‘___主線程結束___‘)
②.主線程超時時間大於子線程運行時間,主線程等待子線程結束候結束了
import threading
import time
def say(name):
print(‘%s is start ‘ % name)
time.sleep(3)
print(‘%s is stop‘%name)
print(‘___主線程開始___‘)
t = threading.Thread(target=say,args=(‘eve‘,))
t.setDaemon(True)
t.start()
t.join(4)
print(‘___主線程結束___‘)
4 如果線程daemon屬性為False, 則join裏的timeout參數無效。主線程會一直等待子線程結束。
import threading
import time
def say(name):
print(‘%s is start ‘ % name)
time.sleep(3)
print(‘%s is stop‘%name)
print(‘___主線程開始___‘)
t = threading.Thread(target=say,args=(‘eve‘,))
t.setDaemon(False)
t.start()
# t.join(4)
print(‘___主線程結束___‘)
5 如果線程daemon屬性為True, 則join裏的timeout參數是有效的, 主線程會等待timeout時間後,結束子線程。此處有一個坑,即如果同時有N個子線程join(timeout),那麽實際上主線程會等待的超時時間最長為 N * timeout, 因為每個子線程的超時開始時刻是上一個子線程超時結束的時刻。
例子如下:
import threading
import time
def say(name):
print(‘%s is start ‘ % name)
time.sleep(3)
print(‘%s is stop‘%name)
print(‘___主線程開始___‘)
t = threading.Thread(target=say,args=(‘eve‘,))
t.setDaemon(True)
t.start()
t.join(4)
print(‘___主線程結束___‘)
python的多線程中的join的作用