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中利用生成器实现的并发编程
May 04 Python
Python自动登录126邮箱的方法
Jul 10 Python
OpenCV2.3.1+Python2.7.3+Numpy等的配置解析
Jan 05 Python
对python修改xml文件的节点值方法详解
Dec 24 Python
Python脚本按照当前日期创建多级目录
Mar 01 Python
用Python写一个模拟qq聊天小程序的代码实例
Mar 06 Python
ubuntu 18.04搭建python环境(pycharm+anaconda)
Jun 14 Python
python使用多线程编写tcp客户端程序
Sep 02 Python
解决Python Matplotlib绘图数据点位置错乱问题
May 16 Python
python怎么判断模块安装完成
Jun 19 Python
matplotlib制作雷达图报错ValueError的实现
Jan 05 Python
python读取pdf格式文档的实现代码
Apr 01 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
超神学院:鹤熙已踏入神圣领域,实力不比凯莎弱
2020/03/02 国漫
用PHP实现将GB编码转换为UTF8
2006/11/25 PHP
PHP 使用pcntl和libevent 实现Timer功能
2013/10/27 PHP
yii2中dropDownList实现二级和三级联动写法
2017/04/26 PHP
使用ThinkPHP生成缩略图及显示
2017/04/27 PHP
PHP7创建销毁session的实例方法
2020/02/03 PHP
thinkphp5 框架结合plupload实现图片批量上传功能示例
2020/04/04 PHP
jquery validation插件表单验证的一个例子
2010/03/03 Javascript
jquery插件制作 自增长输入框实现代码
2012/08/17 jQuery
js单向链表的具体实现实例
2013/06/21 Javascript
checkbox使用示例
2013/08/23 Javascript
javascript怎么禁用浏览器后退按钮
2014/03/27 Javascript
JavaScript中Function()函数的使用教程
2015/06/04 Javascript
js实现简洁大方的二级下拉菜单效果代码
2015/09/01 Javascript
jQuery实现带延迟效果的滑动菜单代码
2015/09/02 Javascript
jQuery获取选中单选按钮radio的值
2016/12/27 Javascript
详谈jQuery中的一些正则匹配表达式
2017/03/08 Javascript
AngularJS service之select下拉菜单效果
2017/07/28 Javascript
vue mounted组件的使用
2018/06/18 Javascript
JS通过位运算实现权限加解密
2018/08/14 Javascript
优雅的将ElementUI表格变身成树形表格的方法步骤
2019/04/11 Javascript
python利用requests库进行接口测试的方法详解
2018/07/06 Python
Python 实现判断图片格式并转换,将转换的图像存到生成的文件夹中
2020/01/13 Python
TensorFLow 不同大小图片的TFrecords存取实例
2020/01/20 Python
python实现同一局域网下传输图片
2020/03/20 Python
Python爬虫后获取重定向url的两种方法
2021/01/19 Python
html5拖拽应用记录及注意点
2020/05/27 HTML / CSS
软件部经理岗位职责范本
2014/02/25 职场文书
技校毕业生自荐信范文
2014/03/07 职场文书
工商行政管理专业求职书
2014/05/23 职场文书
党的群众路线教育实践活动批评与自我批评范文
2014/10/16 职场文书
2015年汽车销售员工作总结
2015/07/24 职场文书
2016年教师党员承诺书范文
2016/03/24 职场文书
MySQL中InnoDB存储引擎的锁的基本使用教程
2021/05/26 MySQL
Go Plugins插件的实现方式
2021/08/07 Golang
GPU服务器的多用户配置方法
2022/07/07 Servers