大家看多線程部分的時候肯定看到過daemon這個屬性,當我在百度了一圈后也沒發現有比較好的解釋(或者大家對這個解釋都非常清楚),於是自己通過代碼和官方介紹了解它,進行了一些總結 給大家一些參考。
首先我們看官方的介紹是這樣的:
A boolean value indicating whether this thread is a daemon thread (True) or not (False). This must be set before start() is called, otherwise RuntimeError is raised. Its initial value is inherited from the creating thread; the main thread is not a daemon thread and therefore all threads created in the main thread default to daemon = False.
The entire Python program exits when no alive non-daemon threads are left.
大概的意思就是說:這個屬性為一個布爾值,表示是否為一個守護進程,且這個屬性設置必須在線程的start方法開始之前調用。它的值繼承自主線程,主線程的daemon為False且所有從主線程創建的線程都是daemon = False的。
下面一句說明了,python主程序只有在沒有非守護線程的時候才會退出。
我在用多線程的時候和看這些介紹的時候2個疑惑:
有的多線程主線程結束,其他的線程就結束了(thread方式)。 而有的主線程則阻塞等待其他線程執行完畢才繼續執行(threading方法)
主線程中創建的線程都是非守護線程嗎?
我們都知道創建線程有最常用的2個方法,分別利用thread和threading模塊
那么我們用代碼看看實際的執行情況是怎樣的

代碼中我們可以看到,創建的線程輸出的daemon是True。 可見問題2是說的不對的。 也就是說在主線程中用start_new_thread創建的線程其實是daemon=True的。這樣就可以解釋我們的主程序不會等待daemon程序執行完畢這個情況了。通過取消注釋sleep語句,我們可以看到主程序執行完畢后其他線程也被銷毀了。
那么我們接下來看看利用threading模塊創建的程序執行情況如何?

從上面的類方式創建的多線程我們可以清晰的看到,此種方式創建的為線程daemon=False。 且會阻塞住主線程的執行
解釋就到這里了,不知道有同樣疑惑的伙伴兒們對你是否有一些幫助。
程序猿、工程師精彩分享
微信號:studypython

歡迎關注公眾號 "人生苦短我用Python"
--------------------------------------
