大家看多執行緒部分的時候肯定看到過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"

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