如何停止守护线程?

How to stop daemon thread?

我有一个简单的生产者消费者应用程序。

生产者是一个将东西写入队列的线程,而消费者是一个从队列中读取消息的线程,它会在某些时候退出。

我的制作人有点像这样

def producer(queue):
    while not queue.full():
        queue.put(randint(1, 199))

和消费者

def consumer(queue):
    for i in range(100):
        print(queue.get())
        queue.task_done()

在我的主程序中,我调用了那些线程

p = Thread(target=producer)
c = Thread(target=consumer)

p.daemon = True
p.start()
c.start()
c.join()

c 完成时,唯一剩下的非守护线程是主线程,结束这些线程的正确方法是什么?

更新

这是我的生产者使用的确切代码,因为消费者正在退出,问题出在生产者身上

def generate_random_alphanumerics(msg_queue):
    while True:
        if not msg_queue.full():
            msg_queue.put(hashlib.sha1(bytes(randint(1, 10000))).hexdigest() * 10)
        else:
            sleep(0.01)

是线程休眠的问题吗?

问题是生产者循环永远不会结束,所以你应该有办法让它停止。

stop_event= threading.Event()
p = Thread(target=producer, args=(msg_queue, stop_event))
p.start()

生产者变为:

def generate_random_alphanumerics(msg_queue, stop_event):
    while not stop_event.is_set():
        if not msg_queue.full():
            [...]

然后,当您想停止生产者时,只需执行以下操作:

stop_event.set()