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实现计算资源图标crc值的方法
Oct 05 Python
用Python编写简单的定时器的方法
May 02 Python
PyCharm 常用快捷键和设置方法
Dec 20 Python
Django中间件实现拦截器的方法
Jun 01 Python
Python3 pip3 list 出现 DEPRECATION 警告的解决方法
Feb 16 Python
python循环定时中断执行某一段程序的实例
Jun 29 Python
python去除删除数据中\u0000\u0001等unicode字符串的代码
Mar 06 Python
python库skimage给灰度图像染色的方法示例
Apr 27 Python
小 200 行 Python 代码制作一个换脸程序
May 12 Python
Python使用OpenPyXL处理Excel表格
Jul 02 Python
如何在python中实现线性回归
Aug 10 Python
python基于tkinter制作下班倒计时工具
Apr 28 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基于redis计数器类定义与用法示例
2018/02/08 PHP
TP5(thinkPHP5)框架使用ajax实现与后台数据交互的方法小结
2020/02/10 PHP
javascript新手语法小结
2008/06/15 Javascript
js TextArea的选中区域处理
2010/12/28 Javascript
jQuery 版元素拖拽原型代码
2011/04/25 Javascript
图片onload事件触发问题解决方法
2011/07/31 Javascript
Jquery实现仿新浪微博获取文本框能输入的字数代码
2013/02/22 Javascript
用Jquery.load载入页面实现局部刷新
2014/01/22 Javascript
深入讲解AngularJS中的自定义指令的使用
2015/06/18 Javascript
javascript创建动态表单的方法
2015/07/25 Javascript
JavaScript 不支持 indexof 该如何解决
2016/03/30 Javascript
AngularJS入门教程之表格实例详解
2016/07/27 Javascript
JS正则表达式验证账号、手机号、电话和邮箱是否合法
2017/03/08 Javascript
微信小程序 页面跳转传值实现代码
2017/07/27 Javascript
js使用html2canvas实现屏幕截取的示例代码
2017/08/28 Javascript
JavaScript引用类型Date常见用法实例分析
2018/08/08 Javascript
vue项目打包之后背景样式丢失的解决方案
2019/01/17 Javascript
微信小程序 Storage更新详解
2019/07/16 Javascript
JavaScript Window浏览器对象模型原理解析
2020/05/30 Javascript
react实现复选框全选和反选组件效果
2020/08/25 Javascript
微信小程序实现首页弹出广告
2020/12/03 Javascript
python利用不到一百行代码实现一个小siri
2017/03/02 Python
VS2019+python3.7+opencv4.1+tensorflow1.13配置详解
2020/04/16 Python
python+opencv3.4.0 实现HOG+SVM行人检测的示例代码
2021/01/28 Python
CSS3+font字体文件实现圆形半透明菜单具体步骤(图解)
2013/06/03 HTML / CSS
html5指南-5.使用web storage存储键值对的数据
2013/01/07 HTML / CSS
澳大利亚电子产品购物网站:Dick Smith
2017/02/02 全球购物
Max&Co官网:意大利年轻女性时尚品牌
2017/05/16 全球购物
采用冷却技术的超自然舒适度:GhostBed床垫
2018/09/18 全球购物
C++是不是类型安全的
2014/02/18 面试题
精彩的演讲稿开头
2014/05/08 职场文书
质量安全标语
2014/06/07 职场文书
环保宣传标语
2014/06/12 职场文书
爱护公物标语
2014/06/24 职场文书
党的群众路线对照检查材料
2014/09/22 职场文书
Python使用OpenCV和K-Means聚类对毕业照进行图像分割
2021/06/11 Python