Python多線程與多線程中join()的用法

Python多線程與多進程中join()方法的效果是相同的。

下面僅以多線程爲例:

首先需要明確幾個概念:

知識點一:
當一個進程啓動之後,會默認產生一個主線程,因爲線程是程序執行流的最小單元,當設置多線程時,主線程會創建多個子線程,在python中,默認情況下(其實就是setDaemon(False)),主線程執行完自己的任務以後,就退出了,此時子線程會繼續執行自己的任務,直到自己的任務結束,例子見下面一。

知識點二:
當我們使用setDaemon(True)方法,設置子線程爲守護線程時,主線程一旦執行結束,則全部線程全部被終止執行,可能出現的情況就是,子線程的任務還沒有完全執行結束,就被迫停止,例子見下面二。

知識點三:
此時join的作用就凸顯出來了,join所完成的工作就是線程同步,即主線程任務結束之後,進入阻塞狀態,一直等待其他的子線程執行結束之後,主線程在終止,例子見下面三。

知識點四:
join有一個timeout參數:

  1. 當設置守護線程時,含義是主線程對於子線程等待timeout的時間將會殺死該子線程,最後退出程序。所以說,如果有10個子線程,全部的等待時間就是每個timeout的累加和。簡單的來說,就是給每個子線程一個timeout的時間,讓他去執行,時間一到,不管任務有沒有完成,直接殺死。
  2. 沒有設置守護線程時,主線程將會等待timeout的累加和這樣的一段時間,時間一到,主線程結束,但是並沒有殺死子線程,子線程依然可以繼續執行,直到子線程全部結束,程序退出。

一:Python多線程的默認情況

import threading
import time

def run():
    time.sleep(2)
    print('當前線程的名字是: ', threading.current_thread().name)
    time.sleep(2)


if __name__ == '__main__':

    start_time = time.time()

    print('這是主線程:', threading.current_thread().name)
    thread_list = []
    for i in range(5):
        t = threading.Thread(target=run)
        thread_list.append(t)

    for t in thread_list:
        t.start()

    print('主線程結束!' , threading.current_thread().name)
    print('一共用時:', time.time()-start_time)

其執行結果如下

關鍵點:

  1. 我們的計時是對主線程計時,主線程結束,計時隨之結束,打印出主線程的用時。
  2. 主線程的任務完成之後,主線程隨之結束,子線程繼續執行自己的任務,直到全部的子線程的任務全部結束,程序結束。

二:設置守護線程
 

import threading
import time

def run():

    time.sleep(2)
    print('當前線程的名字是: ', threading.current_thread().name)
    time.sleep(2)


if __name__ == '__main__':

    start_time = time.time()

    print('這是主線程:', threading.current_thread().name)
    thread_list = []
    for i in range(5):
        t = threading.Thread(target=run)
        thread_list.append(t)

    for t in thread_list:
        t.setDaemon(True)
        t.start()

    print('主線程結束了!' , threading.current_thread().name)
    print('一共用時:', time.time()-start_time)

其執行結果如下,注意請確保setDaemon()在start()之前。

關鍵點:

  1. 非常明顯的看到,主線程結束以後,子線程還沒有來得及執行,整個程序就退出了。

三:join的作用

import threading
import time

def run():

    time.sleep(2)
    print('當前線程的名字是: ', threading.current_thread().name)
    time.sleep(2)


if __name__ == '__main__':

    start_time = time.time()

    print('這是主線程:', threading.current_thread().name)
    thread_list = []
    for i in range(5):
        t = threading.Thread(target=run)
        thread_list.append(t)

    for t in thread_list:
        t.setDaemon(True)
        t.start()

    for t in thread_list:
        t.join()

    print('主線程結束了!' , threading.current_thread().name)
    print('一共用時:', time.time()-start_time)

其執行結果如下:

關鍵點:

  1. 可以看到,主線程一直等待全部的子線程結束之後,主線程自身才結束,程序退出。

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章