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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM