【python教程】对多线程中join()的详细教程
在 Python 的多線程編程中,經常碰到 thread.join()這樣的代碼。那么今天咱們用實際代碼來解釋一下 join 函數的作用。
一、
當一個進程啟動之后,會默認產生一個主線程,因為線程是程序執行流的最小單元,當設置多線程時,主線程會創建多個子線程,在python中,默認情況下(其實就是setDaemon(False)),主線程執行完自己的任務以后,就退出了,此時子線程會繼續執行自己的任務,直到自己的任務結束,例子見下面。
代碼執行結果如下:
start waiting1: 22:24:20start join: 22:24:20 start waiting2: 22:24:20end join: 22:24:20stop waiting1: 22:24:23stop waiting2: 22:24:28二、
當我們使用setDaemon(True)方法,設置子線程為守護線程時,主線程一旦執行結束,則全部線程全部被終止執行,可能出現的情況就是,子線程的任務還沒有完全執行結束,就被迫停止,例子見下面。
代碼執行結果如下:
start waiting1: 22:34:46start waiting2: 22:34:46 start join: 22:34:46end join: 22:34:46三、
沒有設置守護線程且沒有設置join函數的timeout參數時,主線程將會一直等待,直到子線程全部結束,主線程才結束,程序退出。
代碼如下:
# 測試多線程中join的功能 import threading, time def doWaiting():print 'start waiting1: ' + time.strftime('%H:%M:%S') + "\n"time.sleep(3)print 'stop waiting1: ' + time.strftime('%H:%M:%S') + "\n" def doWaiting1():print 'start waiting2: ' + time.strftime('%H:%M:%S') + "\n"time.sleep(8)print 'stop waiting2: ', time.strftime('%H:%M:%S') + "\n" tsk = [] thread1 = threading.Thread(target = doWaiting) thread1.start() tsk.append(thread1) thread2 = threading.Thread(target = doWaiting1) thread2.start() tsk.append(thread2) print 'start join: ' + time.strftime('%H:%M:%S') + "\n" for tt in tsk:tt.join() print 'end join: ' + time.strftime('%H:%M:%S') + "\n"代碼執行結果如下:
start waiting1: 22:41:50start join: 22:41:50 start waiting2: 22:41:50stop waiting1: 22:41:53stop waiting2: 22:41:58end join: 22:41:58四、
當沒有設置守護線程且join函數的參數timeout=2時,主線程將會等待多個子線程timeout的累加和這樣的一段時間,時間一到,主線程結束,但是并沒有殺死子線程,子線程依然可以繼續執行,直到子線程全部結束,程序退出。
代碼如下:
# 測試多線程中join的功能 ''' 學習中遇到問題沒人解答?小編創建了一個Python學習交流QQ群:531509025 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' import threading, time def doWaiting():print 'start waiting1: ' + time.strftime('%H:%M:%S') + "\n"time.sleep(3)print 'stop waiting1: ' + time.strftime('%H:%M:%S') + "\n" def doWaiting1():print 'start waiting2: ' + time.strftime('%H:%M:%S') + "\n"time.sleep(8)print 'stop waiting2: ', time.strftime('%H:%M:%S') + "\n" tsk = [] thread1 = threading.Thread(target = doWaiting) thread1.start() tsk.append(thread1) thread2 = threading.Thread(target = doWaiting1) thread2.start() tsk.append(thread2) print 'start join: ' + time.strftime('%H:%M:%S') + "\n" for tt in tsk:tt.join(2) print 'end join: ' + time.strftime('%H:%M:%S') + "\n"代碼執行結果如下:
start waiting1: 23:02:34start waiting2: 23:02:34 start join: 23:02:34stop waiting1: 23:02:37end join: 23:02:38stop waiting2: 23:02:42五、
當設置守護線程join函數的參數timeout=2時,主線程將會等待多個子線程timeout的累加和這樣的一段時間,時間一到,主線程結束,殺死未執行完的子線程,程序退出。
代碼如下:
# 測試多線程中join的功能 ''' 學習中遇到問題沒人解答?小編創建了一個Python學習交流QQ群:531509025 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' import threading, time def doWaiting():print 'start waiting1: ' + time.strftime('%H:%M:%S') + "\n"time.sleep(3)print 'stop waiting1: ' + time.strftime('%H:%M:%S') + "\n" def doWaiting1():print 'start waiting2: ' + time.strftime('%H:%M:%S') + "\n"time.sleep(8)print 'stop waiting2: ', time.strftime('%H:%M:%S') + "\n" tsk = [] thread1 = threading.Thread(target = doWaiting) thread1.setDaemon(True) thread1.start() tsk.append(thread1) thread2 = threading.Thread(target = doWaiting1) thread2.setDaemon(True) thread2.start() tsk.append(thread2) print 'start join: ' + time.strftime('%H:%M:%S') + "\n" for tt in tsk:tt.join(2) print 'end join: ' + time.strftime('%H:%M:%S') + "\n"代碼執行結果如下:
start waiting1: 23:23:57start waiting2: 23:23:57 start join: 23:23:57stop waiting1: 23:24:00end join: 23:24:01總結
以上是生活随笔為你收集整理的【python教程】对多线程中join()的详细教程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python限定方法参数类型、返回值类型
- 下一篇: 【python教程】IO文件操作的常见用