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

溫馨提示×

溫馨提示×

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

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

python主線程與子線程結束順序的示例分析

發布時間:2021-08-25 09:23:16 來源:億速云 閱讀:106 作者:小新 欄目:開發技術

這篇文章將為大家詳細講解有關python主線程與子線程結束順序的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

引用自 主線程退出對子線程的影響 的一段話:

對于程序來說,如果主進程在子進程還未結束時就已經退出,那么Linux內核會將子進程的父進程ID改為1(也就是init進程),當子進程結束后會由init進程來回收該子進程。

主線程退出后子線程的狀態依賴于它所在的進程,如果進程沒有退出的話子線程依然正常運轉。如果進程退出了,那么它所有的線程都會退出,所以子線程也就退出了。

主線程退出,進程等待所有子線程執行完畢后才結束

進程啟動后會默認產生一個主線程,默認情況下主線程創建的子線程都不是守護線程(setDaemon(False))。因此主線程結束后,子線程會繼續執行,進程會等待所有子線程執行完畢后才結束

所有線程共享一個終端輸出(線程所屬進程的終端)

import threading
import time
def child_thread1():
  for i in range(100):
    time.sleep(1)
    print('child_thread1_running...')
def parent_thread():
  print('parent_thread_running...')
  thread1 = threading.Thread(target=child_thread1)
  thread1.start()
  print('parent_thread_exit...')
if __name__ == "__main__":
  parent_thread()

輸出為:

parent_thread_running...
parent_thread_exit...
child_thread1_running...
child_thread1_running...
child_thread1_running...
child_thread1_running...
...

可見父線程結束后,子線程仍在運行,此時結束進程,子線程才會被終止

主線程結束后進程不等待守護線程完成,立即結束

當設置一個線程為守護線程時,此線程所屬進程不會等待此線程運行結束,進程將立即結束

import threading
import time
def child_thread1():
  for i in range(100):
    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)
  thread1.start()
  thread2.start()
  print('parent_thread_exit...')
if __name__ == "__main__":
  parent_thread()

輸出:

parent_thread_running...
parent_thread_exit...
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_thread2_running...child_thread1_running...

Process finished with exit code 0

thread1是守護線程,thread2非守護線程,因此,進程會等待thread2完成后結束,而不會等待thread1完成

注意:子線程會繼承父線程中daemon的值,即守護線程開啟的子線程仍是守護線程

主線程等待子線程完成后結束

在線程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主線程與子線程結束順序的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

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

AI

呼玛县| 涞水县| 陆川县| 桓台县| 凤山市| 南充市| 兴宁市| 阜平县| 舞钢市| 渑池县| 福贡县| 西宁市| 东城区| 宁国市| 靖宇县| 卢氏县| 奉新县| 平远县| 宜章县| 连州市| 孝昌县| 永新县| 呼伦贝尔市| 永嘉县| 正定县| 阳山县| 长丰县| 昭苏县| 汝南县| 元江| 齐河县| 红桥区| 富民县| 凤城市| 万全县| 汝州市| 吉木乃县| 靖安县| 樟树市| 潼南县| 河曲县|