如何停止守护程序线程?

时间:2016-12-13 21:47:48

标签: python multithreading python-3.x python-multithreading

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

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

我的制作人看起来有点像这样

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完成时,唯一剩下的非deamon线程是main,结束这些线程的正确方法是什么?

更新

这是我的制作人正在使用的确切代码,因为消费者正在退出,而问题在于制作人

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)

是线程正在睡觉的问题吗?

1 个答案:

答案 0 :(得分:14)

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

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()
相关问题