默认情况下主线程创建的子线程都不是守护线程(setDaemon(False))
让我们通过下面代码体会一下:
import threading
import time
def xiulingmu(name):
print(f"{name}正在修建陵墓")
time.sleep(2)
print(f"{name}已经完成修建任务")
workers=["工人1","工人2","工人3","工人4"]
for worker in workers:
t=threading.Thread(target=xiulingmu,args=(worker,))
t.start()
print(threading.active_count())
print("主线程结束了!")
运行后>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
工人1正在修建陵墓
工人2正在修建陵墓
工人3正在修建陵墓
工人4正在修建陵墓
5
主线程结束了!
工人3已经完成修建任务
工人4已经完成修建任务工人1已经完成修建任务
工人2已经完成修建任务
通过运行代码,可以看到主线程运行结束后,子线程没有运行完
当设置某个线程为守护线程的时候,此线程所属进程不会等待子线程运行结束,主线程结束后,进程将立即结束所有子线程。
方法1:创建Thread类对象时,设置为守护线程
创建类对象时,参数daemon传True 即可,这也是最简单的方法
import threading
import time
def xiulingmu(name):
print(f"{name}正在修建陵墓")
time.sleep(2)
print(f"{name}已经完成修建任务")
workers=["工人1","工人2","工人3","工人4"]
for worker in workers:
t=threading.Thread(target=xiulingmu,args=(worker,),daemon=True)#创建Thread类对象时,设置为守护线程
t.start()
print(threading.active_count())
print("主线程结束了!")
运行后>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
工人1正在修建陵墓
工人2正在修建陵墓
工人3正在修建陵墓
工人4正在修建陵墓
5
主线程结束了!
方法2:Thread类对象调用damon属性方法
创建Thread类对象后,实例对象调用damon属性方法,设置为True
import threading
import time
def xiulingmu(name):
print(f"{name}正在修建陵墓")
time.sleep(2)
print(f"{name}已经完成修建任务")
workers=["工人1","工人2","工人3","工人4"]
for worker in workers:
t=threading.Thread(target=xiulingmu,args=(worker,))
t.daemon=True #Thread类对象调用damon属性方法设置
t.start()
print(threading.active_count())
print("主线程结束了!")
运行后>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
工人1正在修建陵墓
工人2正在修建陵墓
工人3正在修建陵墓
工人4正在修建陵墓
5
主线程结束了!
方法3:Thread类对象调用setDaemon(True)方法
创建Thread类对象后,实例对象调用setDaemon()方法,参数传递True
import threading
import time
def xiulingmu(name):
print(f"{name}正在修建陵墓")
time.sleep(2)
print(f"{name}已经完成修建任务")
workers=["工人1","工人2","工人3","工人4"]
for worker in workers:
t=threading.Thread(target=xiulingmu,args=(worker,))
t.setDaemon(True) #Thread类对象调用setDaemon(True)方法
t.start()
print(threading.active_count())
print("主线程结束了!")
运行后>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
工人1正在修建陵墓
工人2正在修建陵墓
工人3正在修建陵墓
工人4正在修建陵墓
5
主线程结束了! #主线程结束后,所有子线程结束!