Python多執行緒與多執行緒中join 的用法

2021-09-24 05:39:20 字數 3464 閱讀 7497

原文:

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

下面僅以多執行緒為例:

首先需要明確幾個概念:

知識點一:

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

知識點二:

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

知識點三:

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

知識點四:

join有乙個timeout引數:

當設定守護執行緒時,含義是主線程對於子執行緒等待timeout的時間將會殺死該子執行緒,最後退出程式。所以說,如果有10個子執行緒,全部的等待時間就是每個timeout的累加和。簡單的來說,就是給每個子執行緒乙個timeout的時間,讓他去執行,時間一到,不管任務有沒有完成,直接殺死。

沒有設定守護執行緒時,主線程將會等待timeout的累加和這樣的一段時間,時間一到,主線程結束,但是並沒有殺死子執行緒,子執行緒依然可以繼續執行,直到子執行緒全部結束,程式退出。

一:python多執行緒的預設情況

import threading

import time

defrun()

: 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)

for t in thread_list:

t.start(

)print

('主線程結束!'

, threading.current_thread(

).name)

print

('一共用時:'

, time.time(

)-start_time)

執行結果:

這是主線程: mainthread

主線程結束! mainthread

一共用時: 0.001049041748046875

當前執行緒的名字是: thread-1

當前執行緒的名字是: thread-2

當前執行緒的名字是: thread-5

當前執行緒的名字是: thread-3

當前執行緒的名字是: thread-4

二:設定守護執行緒

import threading

import time

defrun()

: 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)

for t in thread_list:

t.setdaemon(

true

) t.start(

)print

('主線程結束!'

, threading.current_thread(

).name)

print

('一共用時:'

, time.time(

)-start_time)

執行結果:

這是主線程: mainthread

主線程結束! mainthread

一共用時: 0.0010080337524414062

三:join的作用

import threading

import time

defrun()

: 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)

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)

執行結果:

這是主線程: mainthread

當前執行緒的名字是: thread-1

當前執行緒的名字是: thread-3

當前執行緒的名字是: thread-2

當前執行緒的名字是: thread-4

當前執行緒的名字是: thread-5

主線程結束! mainthread

一共用時: 4.01141881942749

更多關於多執行緒知識可以參考:

python中多執行緒 Python之多執行緒

python之多執行緒 一 概念 1 多工可以由多程序完成,也可以由乙個程序內的多執行緒完成。程序是由若干的執行緒組成,乙個程序至少有乙個程序。執行緒是作業系統直接支援的執行單元,天賜高階預壓通常都是內建多執行緒的支援,python的執行緒是真正的posix thread而不是模擬出來的執行緒。2 ...

python多執行緒 python多執行緒

通常來說,多程序適用於計算密集型任務,多執行緒適用於io密集型任務,如網路爬蟲。關於多執行緒和多程序的區別,請參考這個 下面將使用python標準庫的multiprocessing包來嘗試多執行緒的操作,在python中呼叫多執行緒要使用multiprocessing.dummy,如果是多程序則去掉...

Python多執行緒與多執行緒中join 的用法

文章 python多執行緒與多程序中join 方法的效果是相同的。下面僅以多執行緒為例 首先需要明確幾個概念 知識點一 當乙個程序啟動之後,會預設產生乙個主線程,因為執行緒是程式執行流的最小單元,當設定多執行緒時,主線程會建立多個子執行緒,在python中,預設情況下 其實就是setdaemon f...