2016-01-23 118 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)可以看出的線索。如果只剩下守護線程,它們將全部被突然終止。所以我所描述的兩種方法都應該是有效的......至少,我認爲。 –