您好,登錄后才能下訂單哦!
本篇內容主要講解“Python多線程以及多線程中join()的使用方法”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Python多線程以及多線程中join()的使用方法”吧!
Python多線程與多進程中join()方法的效果是相同的。
下面僅以多線程為例:
知識點一:
當一個進程啟動之后,會默認產生一個主線程,因為線程是程序執行流的最小單元,當設置多線程時,主線程會創建多個子線程,在python中,默認情況下(其實就是setDaemon(False)),主線程執行完自己的任務以后,就退出了,此時子線程會繼續執行自己的任務,直到自己的任務結束,
見下面 例子一。
知識點二:
當我們使用setDaemon(True)方法,設置子線程為守護線程時,主線程一旦執行結束,則全部線程全部被終止執行,可能出現的情況就是,子線程的任務還沒有完全執行結束,就被迫停止,
見下面例子二。
知識點三:
此時join的作用就凸顯出來了,join所完成的工作就是線程同步,即主線程任務在設置join函數的地方,進入阻塞狀態,一直等待其他的子線程執行結束之后,主線程再開始執行直到終止終止,
例子見下面三。
知識點四:
join有一個timeout參數:
當有設置守護線程時,含義是主線程對于子線程等待timeout的時間將會殺死該子線程,最后退出程序。所以說,如果有10個子線程,全部的等待時間就是每個timeout的累加和。簡單的來說,就是給每個子線程一個timeout的時間,讓他去執行,時間一到,不管任務有沒有完成,直接殺死。
沒有設置守護線程時,主線程將會等待timeout的累加和這樣的一段時間,時間一到,主線程結束,但是并沒有殺死子線程,子線程依然可以繼續執行,直到子線程全部結束,程序退出。
import threading import time def run(): 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) thread_list.append(t) for t in thread_list: t.start() print('主線程結束!' , threading.current_thread().name) print('一共用時:', time.time()-start_time)
其執行結果如下:
關鍵:
計時是對主線程計時,主線程結束,計時隨之結束,打印出主線程的用時。
主線程的任務完成之后,主線程隨之結束,子線程繼續執行自己的任務,直到全部的子線程的任務全部結束,程序結束。
import threading import time def run(): 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) thread_list.append(t) for t in thread_list: t.setDaemon(True) t.start() print('主線程結束了!' , threading.current_thread().name) print('一共用時:', time.time()-start_time)
注意:注意請確保setDaemon()在start()之前
其執行結果如下:
關鍵點:
非常明顯的看到,主線程結束以后,子線程還沒有來得及執行,整個程序就退出了。
import threading import time def run(): 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) thread_list.append(t) 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)
其執行結果如下:
關鍵點:
可以看到,主線程一直等待全部的子線程結束之后,主線程自身才結束,程序退出。
主程序意外退出的情況
在線程A中使用B.join()表示線程A在調用join()處被阻塞,且要等待線程B的完成才能繼續執行
import threading import time def child_thread1(): for i in range(10): time.sleep(1) print('child_thread1_running...') def child_thread2(): for i in range(5): time.sleep(1) print('child_thread2_running...') def parent_thread(): print('parent_thread_running...') thread1 = threading.Thread(target=child_thread1) thread2 = threading.Thread(target=child_thread2) thread1.setDaemon(True) thread2.setDaemon(True) thread1.start() thread2.start() thread2.join() 1/0 thread1.join() print('parent_thread_exit...') if __name__ == "__main__": parent_thread()
輸出:
parent_thread_running...
child_thread1_running...
child_thread2_running...
child_thread1_running...
child_thread2_running...
child_thread1_running...
child_thread2_running...
child_thread1_running...
child_thread2_running...
child_thread1_running...
child_thread2_running...
Traceback (most recent call last):
File "E:/test_thread.py", line 31, in <module>
parent_thread()
File "E:/test_thread.py", line 25, in parent_thread
1/0
ZeroDivisionError: integer division or modulo by zero
主線程在執行到thread2.join()時被阻塞,等待thread2結束后才會執行下一句
1/0會使主線程報錯退出,且thread1設置了daemon=True,因此主線程意外退出時thread1也會立即結束。thread1.join()沒有被主線程執行
到此,相信大家對“Python多線程以及多線程中join()的使用方法”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。