国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > Python > 正文

python主線程與子線程的結(jié)束順序?qū)嵗馕?/h1>
2024-09-09 19:03:20
字體:
供稿:網(wǎng)友

這篇文章主要介紹了python主線程與子線程的結(jié)束順序?qū)嵗馕?文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

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

對于程序來說,如果主進(jìn)程在子進(jìn)程還未結(jié)束時(shí)就已經(jīng)退出,那么Linux內(nèi)核會(huì)將子進(jìn)程的父進(jìn)程ID改為1(也就是init進(jìn)程),當(dāng)子進(jìn)程結(jié)束后會(huì)由init進(jìn)程來回收該子進(jìn)程。

主線程退出后子線程的狀態(tài)依賴于它所在的進(jìn)程,如果進(jìn)程沒有退出的話子線程依然正常運(yùn)轉(zhuǎn)。如果進(jìn)程退出了,那么它所有的線程都會(huì)退出,所以子線程也就退出了。

主線程退出,進(jìn)程等待所有子線程執(zhí)行完畢后才結(jié)束

進(jìn)程啟動(dòng)后會(huì)默認(rèn)產(chǎn)生一個(gè)主線程,默認(rèn)情況下主線程創(chuàng)建的子線程都不是守護(hù)線程(setDaemon(False))。因此主線程結(jié)束后,子線程會(huì)繼續(xù)執(zhí)行,進(jìn)程會(huì)等待所有子線程執(zhí)行完畢后才結(jié)束

所有線程共享一個(gè)終端輸出(線程所屬進(jìn)程的終端)

import threadingimport timedef 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......

可見父線程結(jié)束后,子線程仍在運(yùn)行,此時(shí)結(jié)束進(jìn)程,子線程才會(huì)被終止

主線程結(jié)束后進(jìn)程不等待守護(hù)線程完成,立即結(jié)束

當(dāng)設(shè)置一個(gè)線程為守護(hù)線程時(shí),此線程所屬進(jìn)程不會(huì)等待此線程運(yùn)行結(jié)束,進(jìn)程將立即結(jié)束

import threadingimport timedef 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是守護(hù)線程,thread2非守護(hù)線程,因此,進(jìn)程會(huì)等待thread2完成后結(jié)束,而不會(huì)等待thread1完成

注意:子線程會(huì)繼承父線程中daemon的值,即守護(hù)線程開啟的子線程仍是守護(hù)線程

主線程等待子線程完成后結(jié)束

在線程A中使用B.join()表示線程A在調(diào)用join()處被阻塞,且要等待線程B的完成才能繼續(xù)執(zhí)行

import threadingimport timedef 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()
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

主站蜘蛛池模板: 建昌县| 沂水县| 湖口县| 修文县| 满城县| 章丘市| 玉林市| 青龙| 八宿县| 隆尧县| 靖安县| 建平县| 承德市| 红桥区| 灵寿县| 酉阳| 楚雄市| 濮阳县| 龙游县| 保德县| 洪湖市| 新源县| 莲花县| 舟曲县| 泰兴市| 郯城县| 沂源县| 府谷县| 牟定县| 南漳县| 宿松县| 霍林郭勒市| 嘉禾县| 万年县| 镇江市| 通山县| 方城县| 桐乡市| 高州市| 梁河县| 凭祥市|