在進行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那里,等待阻塞的子線程運行結束,然后再繼續執行。