python線程join
『壹』 python多線程的join起什麼作用
塞到主線程中
『貳』 python多線程加了join函數為什麼會變慢
因為不加join的話工作還沒做完就直接退出了呀,join是阻塞等線程執行完畢。
不是快慢的問題,是對和錯的問題。
『叄』 如何在python多線程join掛起後還能在主線程
join():用線程對象調用,如果在一個線程A中調用另一個線程B的join方法,線程A將會等待線程B執行完畢後再執行。
光看這句話或許還沒有特別明白,沒有給出例子,這篇博文就用例子的形式介紹下這個函數的作用。
『肆』 Python中threading的join和setDaemon的區別及用法
Python多線程編程時經常會用到join()和setDaemon()方法,基本用法如下:
join([time]): 等待至線程中止。這阻塞調用線程直至線程的join() 方法被調用中止-正常退出或者拋出未處理的異常-或者是可選的超時發生。
setDaemon,將該線程標記為守護線程或用戶線程
1、join ()方法:主線程A中,創建了子線程B,並且在主線程A中調用了B.join(),那麼,主線程A會在調用的地方等待,直到子線程B完成操作後,才可以接著往下執行,那麼在調用這個線程時可以使用被調用線程的join方法。
原型:join([timeout]),裡面的參數時可選的,代表線程運行的最大時間,即如果超過這個時間,不管這個此線程有沒有執行完畢都會被回收,然後主線程或函數都會接著執行的。
import threadingimport time class MyThread(threading.Thread): def __init__(self, id): threading.Thread.__init__(self) self.id = id def run(self): x = 0 time.sleep(10) print(self.id) print('線程結束:'+str(time.time())) if __name__ == "__main__": t1 = MyThread(999) print('線程開始:'+str(time.time())) t1.start() print('主線程列印開始:'+str(time.time())) for i in range(5): print(i) time.sleep(2) print('主線程列印結束:' + str(time.time()))
線程開始:1497534590.2784667
主線程列印開始:1497534590.2794669
0
1
2
3
4
主線程列印結束:1497534592.279581
999
線程結束:1497534600.2800388
從列印結果可知,線程t1 start後,主線程並沒有等線程t1運行結束後再執行,而是在線程執行的同時,執行了後面的語句。
現在,把join()方法加到啟動線程後面(其他代碼不變)
import threadingimport time class MyThread(threading.Thread): def __init__(self, id): threading.Thread.__init__(self) self.id = id def run(self): x = 0 time.sleep(10) print(self.id) print('線程結束:'+str(time.time())) if __name__ == "__main__": t1 = MyThread(999) print('線程開始:'+str(time.time())) t1.start() t1.join() print('主線程列印開始:'+str(time.time())) for i in range(5): print(i) time.sleep(2) print('主線程列印結束:' + str(time.time()))
線程開始:1497535176.5019968
999
線程結束:1497535186.5025687
主線程列印開始:1497535186.5025687
0
1
2
3
4
主線程列印結束:1497535188.5026832
線程t1 start後,主線程停在了join()方法處,等子線程t1結束後,主線程繼續執行join後面的語句。
2、setDaemon()方法。主線程A中,創建了子線程B,並且在主線程A中調用了B.setDaemon(),這個的意思是,把主線程A設置為守護線程,這時候,要是主線程A執行結束了,就不管子線程B是否完成,一並和主線程A退出.這就是setDaemon方法的含義,這基本和join是相反的。此外,還有個要特別注意的:必須在start() 方法調用之前設置。import threading
import time class MyThread(threading.Thread): def __init__(self, id): threading.Thread.__init__(self) self.id = id def run(self): x = 0 time.sleep(10) print(self.id) print("This is:" + self.getName()) # 獲取線程名稱 print('線程結束:' + str(time.time())) if __name__ == "__main__": t1 = MyThread(999) print('線程開始:'+str(time.time())) t1.setDaemon(True) t1.start() print('主線程列印開始:'+str(time.time())) for i in range(5): print(i) time.sleep(2) print('主線程列印結束:' + str(time.time()))
線程開始:1497536678.8509264
主線程列印開始:1497536678.8509264
0
1
2
3
4
主線程列印結束:1497536680.8510408
t1.setDaemon(True)的操作,將子線程設置為了守護線程。根據setDaemon()方法的含義,父線程列印內容後便結束了,不管子線程是否執行完畢了。
如果在線程啟動前沒有加t1.setDaemon(True),輸出結果為:
線程開始:1497536865.3215919
主線程列印開始:1497536865.3215919
0
1
2
3
4
主線程列印結束:1497536867.3217063
999
This is:Thread-1
線程結束:1497536875.3221638
程序運行中,執行一個主線程,如果主線程又創建一個子線程,主線程和子線程就分兵兩路,分別運行,那麼當主線程完成想退出時,會檢驗子線程是否完成,如果子線程未完成,則主線程會等待子線程完成後再退出;
有時我們需要的是,子線程運行完,才繼續運行主線程,這時就可以用join方法(在線程啟動後面);
但是有時候我們需要的是,只要主線程完成了,不管子線程是否完成,都要和主線程一起退出,這時就可以用setDaemon方法(在線程啟動前面)。
『伍』 Python 中如何結束子線程
等待串口數據導致線程自己sleep而沒有機會執行,主線程的join沒法繼續,方法就是這樣的,換成這個能執行
from threading import *import time class MyThread(Thread): def run (self): self.ifdo = True; while self.ifdo: print 'I am running...' time.sleep(0.1) def stop (self): print 'I will stop it...' self.ifdo = False; tr = MyThread()tr.setDaemon(True)tr.start()time.sleep(1)tr.stop()tr.join()
這樣就更直觀了
from threading import *import time class MyThread(Thread): def run (self): self.ifdo = True; while self.ifdo: print 'I am running...' time.sleep(2) def stop (self): print 'I am stopping it...' self.ifdo = False; tr = MyThread()tr.setDaemon(True)tr.start()print 'I will stop it...'time.sleep(5)tr.stop()tr.join()
『陸』 python threading 一定要 join 嗎
python threading 一定要 join
join ()方法:主線程A中,創建了子線程B,並且在主線程A中調用了B.join(),那麼,主線程A會在調用的地方等待,直到子線程B完成操作後,才可以接著往下執行,那麼在調用這個線程時可以使用被調用線程的join方法。
原型:join([timeout])
裡面的參數時可選的,代表線程運行的最大時間,即如果超過這個時間,不管這個此線程有沒有執行完畢都會被回收,然後主線程或函數都會接著執行的。
『柒』 python join阻塞主線程,多線程還有什麼意義
問題一:
在start前面還是後面append到列表是完全等價的。
因為你的程序(前面省略),等價於:
# 開啟新線程
thread1.start()
thread2.start()
# 等待所有線程完成
thread1.join()
thread2.join()
print "Exiting Main Thread"
列表不是必須的。
問題二:
使用join是為了阻塞當前線程(即主線程),直到兩個子線程結束。
『捌』 python中join如果加在列表下面,是對列表的阻塞還是列表裡面子線程的阻塞
t.join會等待這個t退出後才繼續運行,因為t.join是運行在主線程中,因此會阻塞主線程,即阻塞整個for循環。只有t.join的線程退出後才會繼續執行下一個for循環。在主線程阻塞期間,子線程不會被阻塞,依然會繼續運行。
『玖』 python多線程中為什麼要用for遍歷所有線程然後依次調用join
join 主要用於進程/線程之間的協同,其功能在於等待目的進程/線程執行完畢。
在此,因為你的線程操作很簡單,功能函數執行完成後線程就結束了。join與否就顯得區別不大。
『拾』 python 線程join 什麼意思
join的作用是保證當前線程執行完成後,再執行其它線程。join可以有timeout參數,表示阻塞其它線程timeout秒後,不再阻塞。詳見官方文檔。