2013-10-06 52 views
10

從文檔:http://docs.python.org/2/library/thread當主線程調用sys.exit()時,其他線程會發生什麼?

當主線程退出,這是定義系統中的其他 線程是否存活。在使用本地線程實現的SGI IRIX上,它們能夠存活。在大多數其他系統上,它們在不執行 try ... finally子句或執行對象析構函數時被殺害。

在這裏,在文檔(http://docs.python.org/2/library/threading)它說:

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

讓我們來談談這裏的非守護線程。因爲第一個引號沒有對非守護線程進行任何特殊的引用,所以我會假設,即使非守護線程在主線程退出時也應該被終止。但是,第二個引語表明了另外一點。事實上,當主線程退出時,非守護線程確實不會被終止。那麼,這裏首先引用的是什麼?

+0

編寫代碼並嘗試使用 –

+2

看起來,'thread'模塊將所有事物視爲守護進程線程,而'threading'則添加了「非守護進程」線程的概念。 –

+0

@ user2799617:我編寫了代碼,得出結論「當主線程退出時,非守護線程確實不會被終止」。這就是爲什麼,我想知道什麼時候第一次報價適用,因爲我的系統可能是其中一個「大多數其他系統」:Ubuntu 12.10運行Python 2.7 – gjain

回答

8

您參考的文檔來自兩個不同的模塊:threadthreadingthread是一個低級模塊,提供或多或少直接訪問平臺關於「線程」含義的概念。 threading以較少的平臺依賴性提供了更高層次的「線程」概念。

這就是爲什麼文檔說不同的事情。出口處的底層線程「thread」會發生什麼情況取決於平臺C的線程版本,但在任何情況下,Python都不會嘗試 - 或不要 - 將它們乾淨地關閉。

A threading.Thread是不同的。 Python的正常關機處理的一部分是.join()所有非守護進程threading.Thread線程。因此,直到所有非守護進程threading.Thread線程結束(程序員有責任確保),程序纔會結束。請注意,低級thread模塊線程沒有概念.join() - .join()是實現的更高級別概念不同threading模塊。

建議:使用threading而不是thread,除非您有很好的理由使用thread來代替。 threading表現更好,並提供許多有用的工具。什麼時候使用thread比較好?我想不出一個;-)

注意:在Python 3中,低級別的thread模塊被重命名爲_thread。像往常一樣,領先的下劃線提示「最好不要惹這件事 - 但如果你必須的話,它就在這裏。」

相關問題