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操作MySQL数据库的方法分享
May 29 Python
用python 制作图片转pdf工具
Jan 30 Python
详解Python函数作用域的LEGB顺序
May 14 Python
pandas 小数位数 精度的处理方法
Jun 09 Python
Python爬虫实现获取动态gif格式搞笑图片的方法示例
Dec 24 Python
ubuntu 18.04搭建python环境(pycharm+anaconda)
Jun 14 Python
tensorflow 大于某个值为1,小于为0的实例
Jun 30 Python
完美解决keras 读取多个hdf5文件进行训练的问题
Jul 01 Python
Python面向对象实现方法总结
Aug 12 Python
Python pickle模块常用方法代码实例
Oct 10 Python
如何在windows下安装配置python工具Ulipad
Oct 27 Python
基于Python实现股票收益率分析
Apr 02 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
linux系统下php安装mbstring扩展的二种方法
2014/01/20 PHP
php像数组一样存取和修改字符串字符
2014/03/21 PHP
使用php-timeit估计php函数的执行时间
2015/09/06 PHP
Smarty模板变量与调节器实例详解
2019/07/20 PHP
随鼠标上下滚动的jquery代码
2013/12/05 Javascript
javascript实现行拖动的方法
2015/05/27 Javascript
javascript实现超炫的向上滑行菜单实例
2015/08/03 Javascript
js+html5操作sqlite数据库的方法
2016/02/02 Javascript
jQuery中select与datalist制作下拉菜单时的区别浅析
2016/12/30 Javascript
Bootstrap表单使用方法详解
2017/02/17 Javascript
vue2.0结合DataTable插件实现表格动态刷新的方法详解
2017/03/17 Javascript
微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据(一)
2017/05/11 Javascript
使用原生js写ajax实例(推荐)
2017/05/31 Javascript
关于axios如何全局注册浅析
2018/01/14 Javascript
vue几个常用跨域处理方式介绍
2018/02/07 Javascript
webpack多入口多出口的实现方法
2018/08/17 Javascript
对angularJs中自定义指令replace的属性详解
2018/10/09 Javascript
extract-text-webpack-plugin用法详解
2019/02/14 Javascript
javascript 使用sleep函数的常见方法详解
2020/04/26 Javascript
js实现简单的随机点名器
2020/09/17 Javascript
Python读取txt某几列绘图的方法
2018/10/14 Python
pycharm创建scrapy项目教程及遇到的坑解析
2019/08/15 Python
pytorch使用tensorboardX进行loss可视化实例
2020/02/24 Python
Python Tornado批量上传图片并显示功能
2020/03/26 Python
Python爬虫scrapy框架Cookie池(微博Cookie池)的使用
2021/01/13 Python
css3的图形3d翻转效果应用示例
2014/04/08 HTML / CSS
CSS3 分类菜单效果
2019/05/27 HTML / CSS
2019年Java 最常见的 面试题
2016/10/19 面试题
商务英语本科生的自我评价分享
2013/11/15 职场文书
公司管理建议书范文
2014/03/12 职场文书
人事任命书格式
2014/06/05 职场文书
音乐教师求职信
2014/06/28 职场文书
开服装店计划书
2014/08/15 职场文书
2014年小学安全工作总结
2014/12/04 职场文书
高中政治教师教学反思
2016/02/23 职场文书
ES6 解构赋值的原理及运用
2021/05/25 Javascript