setDaemon python守护进程,队列通信子线程

使用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,那子线程,马上也就会终止,不会在处理了,效果图类似这样:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值