python線(xiàn)程join方法原理解析
這篇文章主要介紹了python線(xiàn)程join方法原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
幾個(gè)事實(shí)
1 python 默認(rèn)參數(shù)創(chuàng)建線(xiàn)程后,不管主線(xiàn)程是否執(zhí)行完畢,都會(huì)等待子線(xiàn)程執(zhí)行完畢才一起退出,有無(wú)join結(jié)果一樣
2 如果創(chuàng)建線(xiàn)程,并且設(shè)置了daemon為true,即thread.setDaemon(True), 則主線(xiàn)程執(zhí)行完畢后自動(dòng)退出,不會(huì)等待子線(xiàn)程的執(zhí)行結(jié)果。而且隨著主線(xiàn)程退出,子線(xiàn)程也消亡。
3 join方法的作用是阻塞,等待子線(xiàn)程結(jié)束,join方法有一個(gè)參數(shù)是timeout,即如果主線(xiàn)程等待timeout,子線(xiàn)程還沒(méi)有結(jié)束,則主線(xiàn)程強(qiáng)制結(jié)束子線(xiàn)程。
4 如果線(xiàn)程daemon屬性為False, 則join里的timeout參數(shù)無(wú)效。主線(xiàn)程會(huì)一直等待子線(xiàn)程結(jié)束。
5 如果線(xiàn)程daemon屬性為T(mén)rue, 則join里的timeout參數(shù)是有效的, 主線(xiàn)程會(huì)等待timeout時(shí)間后,結(jié)束子線(xiàn)程。此處有一個(gè)坑,即如果同時(shí)有N個(gè)子線(xiàn)程join(timeout),那么實(shí)際上主線(xiàn)程會(huì)等待的超時(shí)時(shí)間最長(zhǎng)為 N * timeout, 因?yàn)槊總€(gè)子線(xiàn)程的超時(shí)開(kāi)始時(shí)刻是上一個(gè)子線(xiàn)程超時(shí)結(jié)束的時(shí)刻。
測(cè)試代碼
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" ###子線(xiàn)程如果設(shè)置了t.join(timeout),則根據(jù)timeout的不同,結(jié)果會(huì)不同,前提是設(shè)置了setDaemon(True),否則join的timeout是沒(méi)效的 #設(shè)置了setDaemon(True),但是沒(méi)設(shè)置t.join()的運(yùn)行結(jié)果: #start thread time: 17:25:29 #start thread time: 17:25:29 #start thread time: 17:25:29 #stop main thread #加了t1.setDaemon(True),并且設(shè)置了超時(shí)時(shí)間t.join(1)的運(yùn)行結(jié)果: #start thread time: 17:12:24 #start thread time: 17:12:24 #start thread time: 17:12:24 #stop main thread #沒(méi)加t1.setDaemon(True),并且設(shè)置了超時(shí)時(shí)間t.join(1)的運(yùn)行結(jié)果,不過(guò)因?yàn)閟etDaemon的參數(shù)不是True所以就算設(shè)置了超時(shí)時(shí)間也沒(méi)用: #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 #沒(méi)加t1.setDaemon(True),但是設(shè)置了t.join(),沒(méi)有超時(shí)時(shí)間的阻塞的運(yùn)行結(jié)果: #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 #即沒(méi)有設(shè)置setDaemon(True),也沒(méi)有設(shè)置join()的運(yùn)行結(jié)果: #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
總結(jié):
如果想讓子進(jìn)程正常的運(yùn)行結(jié)束(子進(jìn)程中所有的內(nèi)容都運(yùn)行了),則如果設(shè)置join(timeout)的話(huà),前提是設(shè)置setDaemon(True),且setDaemon的參數(shù)為T(mén)rue,且join(timeout)的超時(shí)時(shí)間必須大于子進(jìn)程執(zhí)行所需的時(shí)間,不然沒(méi)等子進(jìn)程運(yùn)行結(jié)束就超時(shí)退出了或者直接設(shè)置join()不帶超時(shí)時(shí)間,也不用設(shè)置setDaemon(True)了
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 詳解python路徑拼接os.path.join()函數(shù)的用法
- python3 字符串/列表/元組(str/list/tuple)相互轉(zhuǎn)換方法及join()函數(shù)的使用
- 淺談python中拼接路徑os.path.join斜杠的問(wèn)題
- python中join()方法介紹
- Python中.join()和os.path.join()兩個(gè)函數(shù)的用法詳解
- Python常見(jiàn)字符串操作函數(shù)小結(jié)【split()、join()、strip()】
- 深入淺析Python中join 和 split詳解(推薦)
- python多線(xiàn)程編程中的join函數(shù)使用心得
相關(guān)文章
python輸出100以?xún)?nèi)的質(zhì)數(shù)與合數(shù)實(shí)例代碼
本文通過(guò)實(shí)例代碼給大家介紹了python輸出100以?xún)?nèi)的質(zhì)數(shù)與合數(shù)的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2018-07-07Python 實(shí)現(xiàn)取多維數(shù)組第n維的前幾位
今天小編就為大家分享一篇Python 實(shí)現(xiàn)取多維數(shù)組第n維的前幾位,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11python爬蟲(chóng)開(kāi)發(fā)之使用python爬蟲(chóng)庫(kù)requests,urllib與今日頭條搜索功能爬取搜索內(nèi)容實(shí)例
這篇文章主要介紹了python爬蟲(chóng)開(kāi)發(fā)之使用python爬蟲(chóng)庫(kù)requests,urllib與今日頭條搜索功能爬取搜索內(nèi)容實(shí)例,需要的朋友可以參考下2020-03-03Python函數(shù)必須先定義,后調(diào)用說(shuō)明(函數(shù)調(diào)用函數(shù)例外)
這篇文章主要介紹了Python函數(shù)必須先定義,后調(diào)用說(shuō)明(函數(shù)調(diào)用函數(shù)例外),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06Python圖像識(shí)別+KNN求解數(shù)獨(dú)的實(shí)現(xiàn)
這篇文章主要介紹了Python圖像識(shí)別+KNN求解數(shù)獨(dú)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11pytest解讀fixture有效性及跨文件共享fixtures
這篇文章主要為大家介紹了pytest官方文檔fixture有效性及跨文件共享fixtures的解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06一篇文章帶你了解python標(biāo)準(zhǔn)庫(kù)--os模塊
在本篇內(nèi)容里小編給大家整理的是關(guān)于Python中os模塊及用法相關(guān)知識(shí)點(diǎn),有興趣的朋友們可以學(xué)習(xí)下,希望能給你帶來(lái)幫助2021-08-08Python如何根據(jù)關(guān)鍵字逐行提取文本內(nèi)容問(wèn)題
這篇文章主要介紹了Python如何根據(jù)關(guān)鍵字逐行提取文本內(nèi)容問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08