<返回更多

Python threading模块:守护主线程

2022-08-27    VT漫步
加入收藏

threading模块:守护主线程

默认情况下主线程创建的子线程都不是守护线程(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
主线程结束了!  #主线程结束后,所有子线程结束!
声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>