1. 程式人生 > >python的多線程中的join的作用

python的多線程中的join的作用

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的作用