如何停止守护线程?
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()
我有一个简单的生产者消费者应用程序。
生产者是一个将东西写入队列的线程,而消费者是一个从队列中读取消息的线程,它会在某些时候退出。
我的制作人有点像这样
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()