1. 程式人生 > 其它 >Python多執行緒jion()用法

Python多執行緒jion()用法

技術標籤:筆記多執行緒python多程序threadjoin

Python多執行緒與多程序中join()方法的效果是相同的。

下面僅以多執行緒為例:

首先需要明確幾個概念:

  • 知識點一:主程序結束,子程序繼續執行

當一個程序啟動之後,會預設產生一個主執行緒,因為執行緒是程式執行流的最小單元,當設定多執行緒時,主執行緒會建立多個子執行緒,在python中,預設情況下(其實就是setDaemon(False)),主執行緒執行完自己的任務以後,就退出了,此時子執行緒會繼續執行自己的任務,直到自己的任務結束,例子見下面一。

  • 知識點二:主程序結束,子程序被迫結束

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

  • 知識點三:主程序等待子程序全部結束後再結束

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

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

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

1.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. 主執行緒的任務完成之後,主執行緒隨之結束,子執行緒繼續執行自己的任務,直到全部的子執行緒的任務全部結束,程式結束。

2.設定守護程序setDaemon(True)

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. 非常明顯的看到,主執行緒結束以後,子執行緒還沒有來得及執行,整個程式就退出了。

3.jion()的作用

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. 可以看到,主執行緒一直等待全部的子執行緒結束之後,主執行緒自身才結束,程式退出。

https://www.cnblogs.com/cnkai/p/7504980.html