python主線程與子執行緒的結束順序例項解析

2022-09-26 21:24:16 字數 3806 閱讀 1691

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

對於程式來說如果主程序在子程序還未結束時就已經退出,那麼linux核心會將子程序的父程序id改為1(也就是init程序),當子程序結束後會由init程序來**該子程序。

主線程退出後子執行緒的狀態依賴於它所在的程序,如果程序沒有退出的話子執行緒依然正常運轉。如果程序程式設計客棧退出了,那麼它所有的執行緒都會退出,所以子執行緒也就退出了。

主線程退出,程序等待所有子執行緒執行完畢後才結束

程序啟動後會預設產生乙個主線程,預設情況下主線程建立的pupioaxhd子執行緒都不是守護執行緒(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)

thread1www.cppcns.com.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.set

thread1.start()

thread2.start()

thread2.join()

1/0thread1.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

parent_thread()

file "e:/test_thread.py", line 25, in parent_thread

1/0zerodivisionerror: integer division or modulo by zero

主線程在執行到thread2.join()時被阻塞,等待thread2結束後才會執行下一句

1/0 會使主線程報錯退出,且thread1設定了daemon=true,因此主線程意外退出時thread1也會立即結束。thread1.join()沒有被主線程執行

本文標題: python主線程與子執行緒的結束順序例項解析

本文位址:

Android UI主線程與子執行緒

乙個android 程式預設情況只有乙個程序,但是乙個程序可以有多個執行緒。其中有乙個ui 執行緒也稱為ui主線程,ui thread在android程式執行的時候就被建立,主要是負責控制ui介面的顯示 更新和控制項互動。所有的android應用程式元件 包括activity service bro...

python主線程與子執行緒的結束順序

對於程式來說,如果主程序在子程序還未結束時就已經退出,那麼linux核心會將子程序的父程序id改為1 也就是init程序 當子程序結束後會由init程序來 該子程序。主線程退出後子執行緒的狀態依賴於它所在的程序,如果程序沒有退出的話子執行緒依然正常運轉。如果程序退出了,那麼它所有的執行緒都會退出,所...

APUE 執行緒 主線程與子執行緒的關係

include include include include include void pthread prc void arg int main int argc,char argv printf i am main n 執行的結果為 i am main 1 當主線程結束時,整個程序都會結束 子...