中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python線程join方法原理解析

發布時間:2020-09-12 03:26:41 來源:腳本之家 閱讀:150 作者:xushukui 欄目:開發技術

這篇文章主要介紹了python線程join方法原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

幾個事實

1 python 默認參數創建線程后,不管主線程是否執行完畢,都會等待子線程執行完畢才一起退出,有無join結果一樣

2 如果創建線程,并且設置了daemon為true,即thread.setDaemon(True), 則主線程執行完畢后自動退出,不會等待子線程的執行結果。而且隨著主線程退出,子線程也消亡。

3 join方法的作用是阻塞,等待子線程結束,join方法有一個參數是timeout,即如果主線程等待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的不同,結果會不同,前提是設置了setDaemon(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)的運行結果:
#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:13:31

#沒加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)了

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

汽车| 革吉县| 徐水县| 康定县| 哈巴河县| 连云港市| 平陆县| 黎平县| 聂荣县| 丽江市| 平塘县| 罗甸县| 吉首市| 祁门县| 安吉县| 天津市| 秀山| 巧家县| 凤台县| 枣强县| 盈江县| 长兴县| 郁南县| 平顺县| 连江县| 咸宁市| 五华县| 赤水市| 从化市| 四川省| 长沙市| 东阳市| 乐清市| 沧源| 达日县| 绥宁县| 东海县| 温泉县| 咸宁市| 大石桥市| 博湖县|