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