使用setDaemon()和守护线程这方面知识有关, 比如在启动线程前设置thread.setDaemon(True),就是设置该线程为守护线程,
表示该线程是不重要的,进程退出时不需要等待这个线程执行完成。
这样做的意义在于:避免子线程无限死循环,导致退不出程序,也就是避免传说中的孤儿进程。
thread.setDaemon()设置为True, 则主线程执行完毕后会将子线程回收掉,设置为false,主进程执行结束时不会回收子线程
setDaemon()说明:
setDaemon() : 设置此线程是否被主线程守护回收。默认False不回收,需要在 start 方法前调用;
设为True相当于像主线程中注册守护,主线程结束时会将其一并回收。
与队列一起使用,主进程需要一个子线程处理东西,共享一个变量,他们的通信就可以用队列,当主进程有元素塞入,子线程才会处理,
demo.py 为主进程
from zjk import thread_test
from six.moves.queue import Queue
import time
list_queue = Queue(3)
thread_test = thread_test(list_queue)
thread_test.setDaemon(True)
thread_test.start()
while True:
for i in range(10):
if list_queue.full():
print('队列满了,当前大小:%s' % (list_queue.qsize()))
time.sleep(5)
list_queue.put(i)
zjk.py 为要启动的线程去处理队列中的总量
import threading
import time
class thread_test(threading.Thread):
def __init__(self, list_queue):
threading.Thread.__init__(self)
self.list_queue = list_queue
def run(self) -> None:
while True:
if self.list_queue.empty():
print('队列为空')
time.sleep(2)
continue
a = self.list_queue.get()
print('当前处理元素 %s' % a)
运行 demo.py 由于用了死循环,所以打印结果会一直循环,当主进程往队列塞了元素,子线程会处理,否则循环等待,或者队列满了3个也会休息2秒,如果直接停止主进程,setDemao 设置了true,那子线程,马上也就会终止,不会在处理了,效果图类似这样: