python執行緒join方法原理解析

2022-09-28 20:45:25 字數 2629 閱讀 1708

幾個事實

1 python 預設引數建立執行緒後,不管主線程是否執行完畢,都會等待子執行緒執行完畢才一起退出,有無join結果一樣

2 如果建立執行緒,並且設定了daemon為true,即thread.setdaemon(true), 則主線程執行完畢後自動退出,不會等待子執行緒的執行結果。而且隨著主線程退出,子執行緒也消亡。

3 join方法的作用是阻塞,等待子執行緒結束,join方法有乙個引數是timeo即如果主線程等待timeout,子執行緒還沒有結束,則主線程強制結束子執行緒。

4 如果執行緒daemon屬性為false, 則join裡的timeout引數無效。主線程會一直等待子執行緒結束。

5 如果執行緒daemon屬性為true, 則join裡的timeout引數是有效的, 主線程會等待timeout時間後,結束子執行緒。此處有乙個坑,即如果同時有n個子執行緒join(timeout),那麼實際上主線程會等待的超時時間最長為 n * timeout, 因為每個子執行緒的超時開始時刻是上乙個子執行緒超時結束的時刻。

測試**

import threading,time

def func():

print "start thread time: ",time.strftime('%h:%m:%s')

time.sleep(3)

print "stop thread time: ",time.strftime('%h:%m:%s')

thread_list =

for i in range(3):

t1 = threading.thread(target=func)

#t1.setdaemon(true)

thread_list.append(t1)

for r in thread_list:

r.start()

for t in thread_list:

#t.join(1)

t.join()

print "stop main thread"

###子執行緒如果設定了t.join(timeout),則根據timeout的不同,結果會不同,前提是設定了sewww.cppcns.comtdaemon(true),否則join的timeout是沒效的

#設定了setdaemon(true),但是沒設定t.join()的執行結果:

#start thread time: 17:25:29

#start thread time: 17:25:29

#start thread time: 17:25:29

#stop main thread

#加了t1.setdaemon(true),並且設定了超時時間t.join(1)的執行結果:hdawyau

#start thread time: 17:12:24

#start thread time: 17:12:24

#start thread time: 17:12:24

#stop main thread

#沒加t1.setdaemon(true),並且設定了超時時間t.join(1)的執行結果,不過因為setdaemon的引數不是true所以就算設定了超時時間也沒用:

#start thread time: 17:13:28

#start thread time: 17:13:28

#start thread time: 17:13:28

#stop main thread

#stop thread time: 17:13:31

#stop thread time: 17:13:31

#stop thread time: 17:1

#沒加t1.setdaemon(true),但是設定了t.join(),沒有超時時間的阻塞的執行結果:

#start thread time: 17:16:12

#start thread time: 17:16:12

#start thread time: 17:16:12

#stop thread time: 17:16:15

#stop thread time: 17:16:15

#stop thread time: 17:16:15

#stop main thread

#即沒有設定setdaemon(true),也沒有設定join()的執行結果:

#start thread time: 17:22:25

#start thread time: 17:22:25

#start thread time: 17:22:25

#stop main thread

#stop thread time: 17:22:28

#stop thread time: 17:22:28

#stop thread time: 17:22:28

總結:如果想讓子程序正常的執行結束(子程序中所有的內容都執行了),則如果設定join(timeout程式設計客棧)的話,前提是設定setdaemon(true),且setdaemon的引數為true,且join(timeout)的超時時間必須大於子程序執行所需的時間,不然沒等子程序執行結束就超時退出了或者直接設定join()不帶超時時間,也不用設定setdaemon(true)了

本文標題: python執行緒join方法原理解析

本文位址:

多執行緒Join方法

天意憐幽草,人間重晩晴 a.sleep 5000 讓執行緒睡5秒但是,如果你不知道執行緒b需要執行多長時間,並且在a中需要使用到b中的結果,那麼,這時你就可以使用join方法 下面是具體的例子 可以看到,join long time 方法內部其實是呼叫了wait long time 方法,我們了解到...

多執行緒join 方法

直接 public static void main string args for thread t list int n 0 for thread t list catch interruptedexception e system.out.println 完全結束 static class m...

執行緒加入 join方法

join方法用於等待其他執行緒終止 如果執行緒a中呼叫了執行緒b的join方法,那麼執行緒a阻塞,直到執行緒b執行完後,執行緒a從阻塞狀態轉為就緒狀態,等待獲取cpu的使用權。join方法要在start方法呼叫後呼叫才有效,執行緒必須啟動,再加入。例子1 讓兩個執行緒順序列印1,2,3,即執行緒a列...