python主线程与子线程的结束顺序实例解析


Posted in Python onDecember 17, 2019

这篇文章主要介绍了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 相关文章推荐
python获取远程图片大小和尺寸的方法
Mar 26 Python
Python ftp上传文件
Feb 13 Python
深入解读Python解析XML的几种方式
Feb 16 Python
python使用xlrd与xlwt对excel的读写和格式设定
Jan 21 Python
Python+Turtle动态绘制一棵树实例分享
Jan 16 Python
Python返回数组/List长度的实例
Jun 23 Python
python去重,一个由dict组成的list的去重示例
Jan 21 Python
python控制nao机器人身体动作实例详解
Apr 29 Python
教你一步步利用python实现贪吃蛇游戏
Jun 27 Python
利用matplotlib实现根据实时数据动态更新图形
Dec 13 Python
python实现logistic分类算法代码
Feb 28 Python
python 常见的排序算法实现汇总
Aug 21 Python
Django通用类视图实现忘记密码重置密码功能示例
Dec 17 #Python
Django集成celery发送异步邮件实例
Dec 17 #Python
python学生信息管理系统实现代码
Dec 17 #Python
pymysql模块的操作实例
Dec 17 #Python
Django异步任务线程池实现原理
Dec 17 #Python
python 求10个数的平均数实例
Dec 16 #Python
python 经典数字滤波实例
Dec 16 #Python
You might like
一贴学会PHP 新手入门教程
2009/08/03 PHP
PHP开发需要注意的安全问题
2010/09/01 PHP
php记录代码执行时间(实现代码)
2013/07/05 PHP
php 字符串中的\n换行符无效、不能换行的解决方法
2014/04/02 PHP
PHP中soap的用法实例
2014/10/24 PHP
php自定义函数实现二维数组按指定key排序的方法
2016/09/29 PHP
php实现分页功能的详细实例方法
2019/09/29 PHP
使用正则替换变量
2007/05/05 Javascript
FireFox与IE 下js兼容触发click事件的代码
2008/11/20 Javascript
使用Post提交时须将空格转换成加号的解释
2013/01/14 Javascript
javascript查找字符串中出现最多的字符和次数的小例子
2013/10/29 Javascript
js导航栏单击事件背景变换示例代码
2014/01/13 Javascript
JavaScript控制listbox列表框的项目上下移动的方法
2015/03/18 Javascript
js实现的倒计时按钮实例
2015/06/24 Javascript
jQuery中 delegate使用的问题
2015/07/03 Javascript
JS实现点击按钮获取页面高度的方法
2015/11/02 Javascript
jQuery日程管理插件fullcalendar使用详解
2017/01/07 Javascript
Javascript中构造函数要注意的一些坑
2017/01/23 Javascript
从零学习node.js之模块规范(一)
2017/02/21 Javascript
js自定义瀑布流布局插件
2017/05/16 Javascript
vue实现简单的星级评分组件源码
2018/11/16 Javascript
抖音上用记事本编写爱心小程序教程
2019/04/17 Javascript
为nuxt项目写一个面包屑cli工具实现自动生成页面与面包屑配置
2019/09/29 Javascript
Python算法输出1-9数组形成的结果为100的所有运算式
2017/11/03 Python
Python学习笔记之读取文件、OS模块、异常处理、with as语法示例
2019/06/04 Python
python修改linux中文件(文件夹)的权限属性操作
2020/03/05 Python
Python爬虫之Selenium实现关闭浏览器
2020/12/04 Python
HTML5 常用语法一览(列举不支持的属性)
2010/01/26 HTML / CSS
美国最灵活的移动提供商:Tello
2017/07/18 全球购物
Pure Collection美国官网:来自英国羊绒专家的奢华羊绒
2017/11/19 全球购物
StubHub希腊:购买体育赛事、音乐会和剧院门票
2019/08/03 全球购物
阿联酋最好的手机、电子产品和家用电器网上商店:Eros Digital Home
2020/08/09 全球购物
应届生如何写自荐信
2014/01/05 职场文书
数控技术专科生自我评价
2014/01/08 职场文书
浅谈python中的多态
2021/06/15 Python
vue 把二维或多维数组转一维数组
2022/04/24 Vue.js