Python守護執行緒及作用(包含2種建立方式)

2020-07-16 10:04:45
有一種執行緒,它是在後台執行的,它的任務是為其他執行緒提供服務,這種執行緒被稱為“後台執行緒(Daemon Thread)”,又稱為“守護執行緒”或“精靈執行緒”。Python 直譯器的垃圾回收執行緒就是典型的後台執行緒。

後台執行緒有一個特徵,如果所有的前台執行緒都死亡了,那麼後台執行緒會自動死亡。

呼叫 Thread 物件的 daemon 屬性可以將指定執行緒設定成後台執行緒。下面程式將指定執行緒設定成後台執行緒,可以看到當所有的前台執行緒都死亡後,後台執行緒隨之死亡。當在整個虛擬機器中只剩下後台執行緒時,程式就沒有繼續執行的必要了,所以程式也就退出了。
import threading

# 定義後台執行緒的執行緒執行體與普通執行緒沒有任何區別
def action(max):
    for i in range(max):
        print(threading.current_thread().name + "  " + str(i))
t = threading.Thread(target=action, args=(100,), name='後台執行緒')
# 將此執行緒設定成後台執行緒
# 也可在建立Thread物件時通過daemon引數將其設為後台執行緒
t.daemon = True
# 啟動後台執行緒
t.start()
for i in range(10):
    print(threading.current_thread().name + "  " + str(i))
# -----程式執行到此處,前台執行緒(主執行緒)結束------
# 後台執行緒也應該隨之結束
上面程式中先將 t 執行緒設定成後台執行緒(第 10 行程式碼),然後啟動該執行緒。本來該執行緒應該執行到 i 等於 99 時才會結束,但在執行程式時不難發現,該後台執行緒無法執行到 99,因為當主執行緒也就是程式中唯一的前台執行緒執行結束後,程式會主動退出,所以後台執行緒也就被結束了。

從上面的程式可以看出,主執行緒預設是前台執行緒,t執行緒預設也是前台執行緒。但並不是所有的執行緒預設都是前台執行緒,有些執行緒預設就是後台執行緒。前台執行緒建立的子執行緒預設是前台執行緒,後台執行緒建立的子執行緒預設是後台執行緒。

可見,建立後台執行緒有兩種方式:
  1. 主動將執行緒的 daemon 屬性設定為 True。
  2. 後台執行緒啟動的執行緒預設是後台執行緒。

注意,當前台執行緒死亡後,Python 直譯器會通知後台執行緒死亡,但是從它接收指令到做出響應需要一定的時間。如果要將某個執行緒設定為後台執行緒,則必須在該執行緒啟動之前進行設定。也就是說,將 daemon 屬性設為 True,必須在 start() 方法呼叫之前進行,否則會引發 RuntimeError 異常。