2016-01-23 72 views
0

在Python Queue documentation,有下面的例子:的Python:正确终止工作线程

def worker(): 
    while True: 
     item = q.get() 
     do_work(item) 
     q.task_done() 

q = Queue() 
for i in range(num_worker_threads): 
    t = Thread(target=worker) 
    t.daemon = True 
    t.start() 

for item in source(): 
    q.put(item) 

q.join()  # block until all tasks are done 

我只是想知道,如果这是正确的做法,因为它似乎是工作线程不会终止。我认为他们最终会成为僵尸。 Python文档忽略了这个问题吗?谢谢。

回答

1

这取决于你的线程究竟在干什么,以及他们是否应该被允许在他们的一项工作中被终止。

由于您正在使用daemon = True子线程应该在父结束时终止。 (更多信息in the docs here

在另一方面,如果你想要做一个清理了一下清洁,你可能不应该使用while True,而使用while not parent_said_stop,去除daemon = True。然后根据你如何停止父母(无论是通过一些按键点击,中断还是其他任何事情),你可以看到父母正在停止并将消息发送给孩子的事实。 (过程结束时的处事方式可见here

+0

上面的示例使用了多线程,但您在此讨论多处理。守护进程线程即使退出,也不会退出,这与守护进程不同。 –

+0

@JFreebird,我认为同样的事情适用于我从[docs](https://docs.python.org/3/library/threading.html#thread-objects)可以看出的线索。如果只剩下守护线程,它们将全部被突然终止。所以我所描述的两种方法都应该是有效的......至少,我认为。 –