1. 程式人生 > >徹底理解Python多執行緒中的setDaemon與join【配有GIF示意】

徹底理解Python多執行緒中的setDaemon與join【配有GIF示意】

在進行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