我有一个简单的生产者消费者应用程序。
生产者是一个将东西写入队列的线程,而消费者是一个线程,它从队列中读取消息并在某些点退出。
我的制作人看起来有点像这样
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)
是线程正在睡觉的问题吗?
答案 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()