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