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中json格式数据输出的简单实现方法
Oct 31 Python
Python批量更改文件名的实现方法
Oct 29 Python
Python面向对象编程之继承与多态详解
Jan 16 Python
在python中将字符串转为json对象并取值的方法
Dec 31 Python
详解Python装饰器
Mar 25 Python
Python generator生成器和yield表达式详解
Aug 08 Python
django 中使用DateTime常用的时间查询方式
Dec 03 Python
Numpy之reshape()使用详解
Dec 26 Python
pytorch:model.train和model.eval用法及区别详解
Feb 20 Python
使用python修改文件并立即写回到原始位置操作(inplace读写)
Jun 28 Python
pandas 操作 Excel操作总结
Mar 31 Python
Python虚拟环境virtualenv是如何使用的
Jun 20 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
ThinkPHP模版引擎之变量输出详解
2014/12/05 PHP
codeigniter中实现一次性加载多个view的方法
2015/03/20 PHP
学习php设计模式 php实现抽象工厂模式
2015/12/07 PHP
javascript ajax 仿百度分页函数
2013/10/29 Javascript
JS增加行复制行删除行的实现代码
2013/11/09 Javascript
chrome不支持form.submit的解决方案
2015/04/28 Javascript
基于jQuery实现复选框是否选中进行答题提示
2015/12/10 Javascript
实例讲解javascript注册事件处理函数
2016/01/09 Javascript
JS中split()用法(将字符串按指定符号分割成数组)
2016/10/24 Javascript
纯javaScript、jQuery实现个性化图片轮播【推荐】
2017/01/08 Javascript
微信小程序获取手机号授权用户登录功能
2017/11/09 Javascript
vue jsx 使用指南及vue.js 使用jsx语法的方法
2017/11/11 Javascript
webpack学习教程之前端性能优化总结
2017/12/05 Javascript
vue组件中使用props传递数据的实例详解
2018/04/08 Javascript
微信小程序实现Swiper轮播图效果
2019/11/22 Javascript
vue多个元素的样式选择器问题
2019/11/29 Javascript
详解JS预解析原理
2020/06/16 Javascript
javaScript代码飘红报错看不懂?读完这篇文章再试试
2020/08/19 Javascript
[01:19]DOTA2城市挑战赛报名开始 开启你的城市传奇
2018/03/23 DOTA
Python中用max()方法求最大值的介绍
2015/05/15 Python
详解设计模式中的工厂方法模式在Python程序中的运用
2016/03/02 Python
Python实现的栈(Stack)
2018/01/26 Python
使用EduBlock轻松学习Python编程
2018/10/08 Python
python读取几个G的csv文件方法
2019/01/07 Python
Python3.4学习笔记之列表、数组操作示例
2019/03/01 Python
python随机模块random的22种函数(小结)
2020/05/15 Python
AmazeUI 加载进度条的实现示例
2020/08/20 HTML / CSS
俄罗斯香水和化妆品购物网站:Л’Этуаль
2018/05/10 全球购物
I.T集团香港官方商城:ITeSHOP.com Hong Kong
2019/02/15 全球购物
UNIX文件系统分类
2014/11/11 面试题
中专生学习生活的自我评价分享
2013/10/27 职场文书
如何客观的进行自我评价
2013/12/17 职场文书
大学活动总结格式
2014/04/29 职场文书
员工试用期自我鉴定范文
2014/09/15 职场文书
党员心得体会范文2016
2016/01/23 职场文书
导游词之张家口
2019/12/13 职场文书