說說Python多線程中的daemon屬性方法


大家看多線程部分的時候肯定看到過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個疑惑:

  1. 有的多線程主線程結束,其他的線程就結束了(thread方式)。 而有的主線程則阻塞等待其他線程執行完畢才繼續執行(threading方法)

  2. 主線程中創建的線程都是非守護線程嗎?

 

我們都知道創建線程有最常用的2個方法,分別利用thread和threading模塊

那么我們用代碼看看實際的執行情況是怎樣的


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

 

那么我們接下來看看利用threading模塊創建的程序執行情況如何?


從上面的類方式創建的多線程我們可以清晰的看到,此種方式創建的為線程daemon=False。 且會阻塞住主線程的執行

 

解釋就到這里了,不知道有同樣疑惑的伙伴兒們對你是否有一些幫助。

 

程序猿、工程師精彩分享

微信號:studypython

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

--------------------------------------

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM