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 相关文章推荐
在Django同1个页面中的多表单处理详解
Jan 25 Python
Python字典创建 遍历 添加等实用基础操作技巧
Sep 13 Python
Python线程下使用锁的技巧分享
Sep 13 Python
python二进制文件的转译详解
Jul 03 Python
Django中使用CORS实现跨域请求过程解析
Aug 05 Python
python中matplotlib条件背景颜色的实现
Sep 02 Python
python sorted方法和列表使用解析
Nov 18 Python
Win10用vscode打开anaconda环境中的python出错问题的解决
May 25 Python
树莓派升级python的具体步骤
Jul 05 Python
Python3爬虫里关于代理的设置总结
Jul 30 Python
django下创建多个app并设置urls方法
Aug 02 Python
利用Python实现翻译HTML中的文本字符串
Jun 21 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
最贵的咖啡是怎么产生的,它的风味怎么样?
2021/03/04 新手入门
php防注
2007/01/15 PHP
快速配置PHPMyAdmin方法
2008/06/05 PHP
php设计模式之单例模式使用示例
2014/01/20 PHP
PHP实现Javascript中的escape及unescape函数代码分享
2015/02/10 PHP
php利用fsockopen GET/POST提交表单及上传文件
2017/05/22 PHP
php实现的错误处理封装类实例
2017/06/20 PHP
jQuery插件Easyui设置datagrid的pageNumber导致两次请求问题的解决方法
2016/08/06 Javascript
vuejs响应用户事件(如点击事件)
2017/03/14 Javascript
jQuery实现分页功能(含ajax请求、后台数据、附完整demo)
2017/04/03 jQuery
JS轮播图实现简单代码
2021/02/19 Javascript
实现图片首尾平滑轮播(JS原生方法—节流)
2017/10/17 Javascript
Angular实现的敏感文字自动过滤与提示功能示例
2017/12/29 Javascript
详解Angular5 路由传参的3种方法
2018/04/28 Javascript
玩转Koa之koa-router原理解析
2018/12/29 Javascript
node链接mongodb数据库的方法详解【阿里云服务器环境ubuntu】
2019/03/07 Javascript
在Vue项目中使用snapshot测试的具体使用
2019/04/16 Javascript
微信小程序事件 bindtap bindinput代码实例
2019/08/26 Javascript
JS如何生成随机验证码
2020/03/02 Javascript
Node.js API详解之 util模块用法实例分析
2020/05/09 Javascript
JS hasOwnProperty()方法检测一个属性是否是对象的自有属性的方法
2021/01/29 Javascript
windows下python安装pip图文教程
2018/05/25 Python
解决Python找不到ssl模块问题 No module named _ssl的方法
2019/04/29 Python
Python Tornado实现WEB服务器Socket服务器共存并实现交互的方法
2020/05/26 Python
pytorch cuda上tensor的定义 以及减少cpu的操作详解
2020/06/23 Python
Python学习笔记之装饰器
2020/08/06 Python
Python如何使用ConfigParser读取配置文件
2020/11/12 Python
全网最详细的PyCharm+Anaconda的安装过程图解
2021/01/25 Python
CSS3属性 line-clamp控制文本行数的使用
2020/03/19 HTML / CSS
Sarenza德国:法国最大的时尚鞋和包包网上商店
2019/06/08 全球购物
是什么让J2EE适合用来开发多层的分布式的应用
2015/01/16 面试题
求职简历推荐信范文
2013/12/02 职场文书
八一建军节部队活动方案
2014/02/04 职场文书
《北京的春节》教学反思
2014/04/07 职场文书
教师一岗双责责任书
2014/04/16 职场文书
2015年工程师工作总结
2015/04/30 职场文书