2008-10-10 180 views
161

Python documentation 它說:守護線程說明

線程可以被標記爲「守護線程」。這個 標誌的意義在於,只有守護程序線程 剩下時,整個Python程序纔會退出。初始值是從創建線程繼承的。

有沒有人有更清楚的解釋這是什麼意思或一個實際的例子顯示你想要設置線程daemonic


爲了澄清對我來說:

所以唯一的一次不會組線程作爲惡魔的是,如果你想讓他們繼續在主線程退出後運行?

回答

319

一些線程執行後臺任務,例如發送keepalive數據包,或執行定期垃圾回收等等。這些僅在主程序運行時纔有用,並且一旦其他非守護線程退出就可以關閉它們。

沒有守護進程線程,你必須跟蹤它們,並告訴它們退出程序才能完全退出。通過將它們設置爲守護進程線程,您可以讓它們運行並忘記它們,並且當程序退出時,任何守護進程線程都會自動終止。

+11

這真的是一個了不起的解釋,因爲你提到了哪些現實世界的職責可以分配爲守護進程線程。謝謝! – dotancohen 2013-09-02 10:33:09

+0

因此,如果我有一個正在執行文件寫入操作的子線程設置爲非deamon,那麼這是否意味着我必須使其明確退出? – 2014-06-15 15:19:55

+3

@san寫作者完成寫作後,你的作家會做什麼?它只是返回嗎?如果是這樣,那就足夠了。守護進程線程通常用於循環運行的內容,不會自行退出。 – 2014-06-15 15:21:21

21

假設您正在製作某種儀表板小部件。作爲其中的一部分,您希望它在郵箱中顯示未讀郵件數量。所以你做一個小線程將:

  1. 連接到郵件服務器,並詢問你有多少條未讀郵件。
  2. 用更新的計數標誌GUI。
  3. 睡一會兒。

當你的小部件啓動時,它會創建這個線程,指定它爲守護進程並啓動它。因爲它是一個守護進程,所以你不必考慮它;當你的小部件退出時,線程將自動停止。

13

一個更簡單的方式來思考它,也許:當主返回時,如果非守護線程仍在運行,您的進程將不會退出。

一些建議:當涉及到線程和同步時,乾淨關閉很容易出錯 - 如果可以避免它,那就這樣做。儘可能使用守護進程線程。

9

其他海報給出了一些使用守護進程線程的例子。然而,我的建議永遠不會使用它們。

這並不是因爲它們沒有用處,而是因爲如果您使用它們,您可能會遇到一些不良的副作用。在Python運行時開始拆除主線程中的東西后,守護線程仍然可以執行,導致一些相當奇怪的異常。

此處瞭解詳情:

https://joeshaw.org/python-daemon-threads-considered-harmful/

https://mail.python.org/pipermail/python-list/2005-February/343699.html

嚴格來說你永遠需要他們,只是讓某些情況下更容易實現。

4

引用Chris:「...當程序退出時,任何守護程序線程都會自動終止。」我認爲這是總結。當你使用它們時你應該小心,因爲當主程序執行完成時它們突然終止。

8

Chris已經解釋了守護線程是什麼,所以讓我們來談談實際的使用。許多線程池實現爲任務工作者使用守護進程線程。工作人員是從任務隊列執行任務的線程。

工作人員需要無限期地等待任務隊列中的任務,因爲他們不知道何時會出現新的任務。分配任務的線程(比如主線程)只知道任務何時結束。主線程在任務隊列上等待變空,然後退出。如果工作者是用戶線程,即非守護進程,則程序不會終止。即使工人沒有做任何有用的工作,它仍會繼續等待這些無限期工作的工人。標記worker守護進程線程,主線程會在完成處理任務後立即處理它們。