徹底理解Python多執行緒中的setDaemon與join【配有GIF示意】
阿新 • • 發佈:2019-11-02
在進行Python多執行緒程式設計時, join() 和 setDaemon() 是最常用的方法,下面說說兩者的用法和區別。
1、join ()
例子:主執行緒A中,建立了子執行緒B,並且在主執行緒A中呼叫了B.join(),
那麼,主執行緒A會在呼叫的地方阻塞,直到子執行緒B完成操作後,才可以接著往下執行。
2、setDaemon()
例子:主執行緒A中,建立了子執行緒B,並且在主執行緒A中呼叫了B.setDaemon(),
即:把主執行緒A設定為守護執行緒,這時候,要是主執行緒A執行結束了,就不管子執行緒B是否完成,一併和主執行緒A退出。
注意:必須在start() 方法呼叫之前設定,如果不設定為守護執行緒,程式會被無限掛起。
3、區別
兩者基本是相反的(join主執行緒等子執行緒完事【橫刀立馬】,setDaemon主執行緒管好自己就可以了,不等子執行緒完事【義無反顧】)。
4、程式碼層面理解
# coding:utf-8 import threading import time def get_list_page(): print("列表頁抓取開始\n") time.sleep(3) print("列表頁抓取結束\n") def get_detail_page(): print("詳情頁抓取開始\n") time.sleep(2) print("詳情頁抓取結束\n") # 建立兩個子執行緒 thread1 = threading.Thread(target=get_list_page) thread2 = threading.Thread(target=get_detail_page) start_time = time.time() # # 設定執行緒守護 # thread1.setDaemon(True) # thread2.setDaemon(True) # 啟動兩個執行緒 thread1.start() thread2.start() # # 設定執行緒阻塞 # thread1.join() # thread2.join() print("Run time is {}".format(time.time() - start_time))
執行結果:
解釋:
三個執行緒基本屬於併發,主執行緒、子執行緒1、子執行緒2會同時執行,各幹各的,
並且,主執行緒會等到兩個子執行緒結束後,才會結束。
設定執行緒守護(setDaemon()) 即反註釋24-26行:
解釋:
有了守護執行緒之後,主執行緒就會在自身結束後,(不管守護執行緒還是不是在執行)kill掉守護執行緒。
設定執行緒阻塞(join()) 即反註釋32-34行:
解釋:
有了執行緒阻塞後,主執行緒就會停在join那裡,等待阻塞的子執行緒執行結束,然後再繼續執行。
&n