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中optparser库用法实例详解
Jan 26 Python
Python使用win32com模块实现数据库表结构自动生成word表格的方法
Jul 17 Python
在IPython中执行Python程序文件的示例
Nov 01 Python
Django中多种重定向方法使用详解
Jul 17 Python
python开头的coding设置方法
Aug 08 Python
解决Keras 与 Tensorflow 版本之间的兼容性问题
Feb 07 Python
python属于软件吗
Jun 18 Python
为什么相对PHP黑python的更少
Jun 21 Python
在tensorflow实现直接读取网络的参数(weight and bias)的值
Jun 24 Python
python中如何打包用户自定义模块
Sep 23 Python
python 判断一组数据是否符合正态分布
Sep 23 Python
python爬取抖音视频的实例分析
Jan 19 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
在JavaScript中调用php程序
2009/03/09 PHP
PHP中将网页导出为Word文档的代码
2012/05/25 PHP
解决PHP超大文件下载,断点续传下载的方法详解
2013/06/06 PHP
win7计划任务定时执行PHP脚本设置图解
2014/05/09 PHP
PHP中__autoload和Smarty冲突的简单解决方法
2016/04/08 PHP
Yii框架数据库查询、增加、删除操作示例
2019/10/14 PHP
Javascript里使用Dom操作Xml
2007/01/22 Javascript
Prototype使用指南之selector.js说明
2008/10/26 Javascript
javascript function调用时的参数检测常用办法
2010/02/26 Javascript
JavaScript基础知识之数据类型
2012/08/06 Javascript
IE6中链接A的href为javascript协议时不在当前页面跳转
2014/06/05 Javascript
JS显示下拉列表框内全部元素的方法
2015/03/31 Javascript
javascript解析xml实现省市县三级联动的方法
2015/07/25 Javascript
js实现表单多按钮提交action的处理方法
2015/10/24 Javascript
JavaScript对象数组排序函数及六个用法
2015/12/23 Javascript
Jquery获取第一个子元素简单实例
2016/06/02 Javascript
Vue中建立全局引用或者全局命令的方法
2017/08/21 Javascript
浅谈vue的踩坑路
2017/08/31 Javascript
JavaScript实现焦点进入文本框内关闭输入法的核心代码
2017/09/20 Javascript
vue生命周期的探索
2019/04/03 Javascript
JS实现水平遍历和嵌套递归操作示例
2019/08/15 Javascript
原生javascript中this几种常见用法总结
2020/02/24 Javascript
Python实现通讯录功能
2018/02/22 Python
Python学习笔记之open()函数打开文件路径报错问题
2018/04/28 Python
python实现可视化动态CPU性能监控
2018/06/21 Python
python统计字符的个数代码实例
2020/02/07 Python
python实现自动清理重复文件
2020/08/24 Python
使用canvas绘制超炫时钟
2014/12/17 HTML / CSS
利用HTML5 Canvas制作一个简单的打飞机游戏
2015/05/11 HTML / CSS
Holland & Barrett爱尔兰:英国领先的健康零售商
2019/03/31 全球购物
苏格兰在线威士忌商店:The Whisky Barrel
2019/05/07 全球购物
试用期员工考核制度
2014/01/22 职场文书
采购经理岗位职责
2014/02/16 职场文书
大学生职业生涯规划书汇总
2014/03/20 职场文书
小学生环保演讲稿
2014/04/25 职场文书
一百条裙子读书笔记
2015/07/01 职场文书