Python多线程之阻塞join和线程守护setDeamon
多线程默认情况
无阻塞无线程守护。
import threading
import time
def run(process = 'python'):
time.sleep(2)
print('当前线程的名字是: ', process)
if __name__ == '__main__':
thread_list = ['know','like','love','marry']
start_time = time.time()
print("这是主线程",threading.current_thread().name)
for i in thread_list:
t = threading.Thread(target = run,args = ((i,)))
t.start()
print("主线程结束!",threading.current_thread().name)
end_time = time.time()
print("一共用时:",end_time-start_time)
运行结果:
这是主线程 MainThread
主线程结束! MainThread
一共用时: 0.00327301025390625
当前线程的名字是: like
当前线程的名字是: know
当前线程的名字是: love
当前线程的名字是: marry
从结果可以看出主线程结束后,子线程还在执行,最后结束。
设置线程守护setDaemon的作用
import threading
import time
def run(process = 'python'):
time.sleep(2)
print('当前线程的名字是: ', process)
if __name__ == '__main__':
thread_list = ['know','like','love','marry']
start_time = time.time()
print("这是主线程",threading.current_thread().name)
for i in thread_list:
t = threading.Thread(target = run,args = ((i,)))
t.setDaemon(True)
t.start()
print("主线程结束!",threading.current_thread().name)
end_time = time.time()
print("一共用时:",end_time-start_time)
运行结果:
这是主线程 MainThread
主线程结束! MainThread
一共用时: 0.002863645553588867
设置线程守护为True时,当主线程结束时,如果子线程没有执行完,将会被kill掉;设置线程守护为False时,线程守护没有作用。
线程阻塞join作用
import threading
import time
def run(process = 'python'):
time.sleep(2)
print('当前线程的名字是: ', process)
if __name__ == '__main__':
thread_list = ['know','like','love','marry']
start_time = time.time()
print("这是主线程",threading.current_thread().name)
for i in thread_list:
t = threading.Thread(target = run,args = ((i,)))
t.setDaemon(True)
t.start()
t.join()
print("主线程结束!",threading.current_thread().name)
end_time = time.time()
print("一共用时:",end_time-start_time)
运行结果:
这是主线程 MainThread
当前线程的名字是: know
当前线程的名字是: like
当前线程的名字是: love
当前线程的名字是: marry
主线程结束! MainThread
一共用时: 8.01774787902832
主线程一直等待全部的子线程结束之后,主线程自身才结束,程序退出.