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实现对一个完整url进行分割的方法
Apr 29 Python
在Python的Django框架的视图中使用Session的方法
Jul 23 Python
Django重装mysql后启动报错:No module named ‘MySQLdb’的解决方法
Apr 22 Python
Django分页查询并返回jsons数据(中文乱码解决方法)
Aug 02 Python
python将txt文件读入为np.array的方法
Oct 30 Python
Python3+Appium安装使用教程
Jul 05 Python
pandas通过字典生成dataframe的方法步骤
Jul 23 Python
详解Python是如何实现issubclass的
Jul 24 Python
python中的Elasticsearch操作汇总
Oct 30 Python
Python cookie的保存与读取、SSL讲解
Feb 17 Python
Python Tornado之跨域请求与Options请求方式
Mar 28 Python
Python实现智慧校园自动评教全新版
Jun 18 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
Yii不依赖Model的表单生成器用法实例
2014/12/04 PHP
php设计模式之单例模式实例分析
2015/02/25 PHP
xtree.js 代码
2007/03/13 Javascript
js 表单验证方法(实用)
2009/04/28 Javascript
有趣的javascript数组定义方法
2010/09/10 Javascript
javascript变量作用域使用中常见错误总结
2013/03/26 Javascript
实例说明为什么不要行内使用javascript
2014/04/18 Javascript
jQuery+ajax+asp.net获取Json值的方法
2016/06/08 Javascript
vue中关闭eslint的方法分析
2018/08/04 Javascript
详解Axios统一错误处理与后置
2018/09/26 Javascript
微信小程序module.exports模块化操作实例浅析
2018/12/20 Javascript
详解Vue.js v-for不支持IE9的解决方法
2018/12/29 Javascript
配置node服务器并且链接微信公众号接口配置步骤详解
2019/06/21 Javascript
js实现小球在页面规定的区域运动
2020/06/16 Javascript
vue axios封装httpjs,接口公用配置拦截操作
2020/08/11 Javascript
[03:00]DOTA2-DPC中国联赛1月18日Recap集锦
2021/03/11 DOTA
python复制文件代码实现
2013/12/23 Python
Python算法应用实战之队列详解
2017/02/04 Python
Python开发的HTTP库requests详解
2017/08/29 Python
Python3实现的Mysql数据库操作封装类
2018/06/06 Python
python实现输入数字的连续加减方法
2018/06/22 Python
[原创]Python入门教程2. 字符串基本操作【运算、格式化输出、常用函数】
2018/10/29 Python
python requests抓取one推送文字和图片代码实例
2019/11/04 Python
python add_argument()用法解析
2020/01/29 Python
python yield和Generator函数用法详解
2020/02/10 Python
Python 生成VOC格式的标签实例
2020/03/10 Python
远程调用的原理
2014/07/05 面试题
Ruby如何实现动态方法调用
2012/11/18 面试题
既然说Ruby中一切都是对象,那么Ruby中类也是对象吗
2013/01/26 面试题
《一个中国孩子的呼声》教学反思
2014/02/12 职场文书
农村结婚典礼司仪主持词
2014/03/14 职场文书
计算机网络专业求职信
2014/06/05 职场文书
乡镇党员干部群众路线对照检查材料思想汇报
2014/09/28 职场文书
网站出售协议书范文
2014/10/10 职场文书
学校实习推荐信
2015/03/27 职场文书
单位介绍信格式范文
2015/05/04 职场文书