赞
赏
在 Python 中,线程 分为三种形式,即主线程、守护线程和非守护线程。主线程也叫 main 线程,主线程不是守护线程。
守护线程是指在程序运行的时候在后台提供一种通用服务的线程,非守护线程也叫用户线程,是由用户创建的线程。
当主线程结束时,守护线程也会一起销毁,而主线程的退出,对非守护线程没有任何影响,因为主线程和守护线程互不影响。
class MyThread(threading.Thread):
def __init__(self, params):
pass
def run(self):
pass
t1 = MyThread(params)
t.setDaemon(True)
t1.start()
我们在创建线程实例之后,调用线程实例的 setDaemon 函数,即可以将线程设置为守护线程,同时,setDaemon 函数必须在 start() 之前调用。
使用 threading 模块自定义线程类创建守护线程
import threading
import time
class MyThread(threading.Thread):
def __init__(self, name, n):
super(MyThread, self).__init__()
self.name = name
self.n = n
def run(self):
while True:
print("Thread ", self.name, "is running")
time.sleep(self.n)
def main():
t1 = MyThread("t1", 3)
t1.setDaemon(True)
t1.start()
t2 = MyThread("t2", 2)
t2.setDaemon(True)
t2.start()
if __name__ == "__main__":
print("嗨客网(www.haicoder.net)")
main()
程序运行后,控制台输出如下:
我们在创建了线程实例之后,使用线程实例的 setDaemon 方法将线程设置为守护线程,此时,我们看到主线程退出之后,我们的守护线程也立刻退出了,而不像用户线程,如果主线程退出,用户线程不受任何影响。
这里,我们的守护线程虽然有 while 循环,但因为我们的主线程没有 sleep 等待,也没有被阻塞,因此运行后会立刻退出,主线程退出,我们的守护线程也会自动退出。
当主线程结束时,守护线程也会一起销毁,而主线程的退出,对非守护线程没有任何影响,因为主线程和守护线程互不影响。