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内存管理分析
Apr 08 Python
Python  pip安装lxml出错的问题解决办法
Feb 10 Python
python中Switch/Case实现的示例代码
Nov 09 Python
python自动登录12306并自动点击验证码完成登录的实现源代码
Apr 25 Python
python3 unicode列表转换为中文的实例
Oct 26 Python
对python mayavi三维绘图的实现详解
Jan 08 Python
100行Python代码实现每天不同时间段定时给女友发消息
Sep 27 Python
详解numpy矩阵的创建与数据类型
Oct 18 Python
Python 程序报错崩溃后如何倒回到崩溃的位置(推荐)
Jun 23 Python
python如何代码集体右移
Jul 20 Python
关于Python3的import问题(pycharm可以运行命令行import错误)
Nov 18 Python
Python通过loop.run_in_executor执行同步代码 同步变为异步
Apr 11 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 用数组降低程序的时间复杂度
2009/12/04 PHP
php生成excel列序号代码实例
2013/12/24 PHP
PHP输出缓存ob系列函数详解
2014/03/11 PHP
PHP递归实现层级树状展开
2016/04/01 PHP
PHP 匿名函数与注意事项详细介绍
2016/11/26 PHP
yii2.0整合阿里云oss上传单个文件的示例
2017/09/19 PHP
laravel 创建命令行命令的图文教程
2019/10/23 PHP
用javascript实现兼容IE7的类库 IE7_0_9.zip提供下载
2007/08/08 Javascript
JQuery在光标位置插入内容的实现代码
2010/06/18 Javascript
Javascript模块化编程(三)require.js的用法及功能介绍
2013/01/17 Javascript
jquery 关于event.target使用的几点说明介绍
2013/04/26 Javascript
php读取sqlite数据库入门实例代码
2014/06/25 Javascript
javascript制作2048游戏
2015/03/30 Javascript
基于jquery实现放大镜效果
2015/08/17 Javascript
基于Echarts 3.19 制作常用的图形(非静态)
2016/05/19 Javascript
JS监控关闭浏览器操作的实例详解
2017/09/12 Javascript
JavaScript 中的 this 工作原理
2018/06/20 Javascript
vue router总结 $router和$route及router与 router与route区别
2019/07/05 Javascript
vue父子组件的通信方法(实例详解)
2019/11/10 Javascript
解决vant中 tab栏遇到的坑 van-tabs
2020/11/04 Javascript
python连接mysql调用存储过程示例
2014/03/05 Python
Python正则表达式匹配HTML页面编码
2015/04/08 Python
python基于ID3思想的决策树
2018/01/03 Python
python使用logging模块发送邮件代码示例
2018/01/18 Python
Python 利用scrapy爬虫通过短短50行代码下载整站短视频
2018/10/29 Python
彪马法国官网:PUMA法国
2019/12/15 全球购物
英文自我鉴定
2013/12/10 职场文书
税务干部鉴定材料
2014/02/11 职场文书
安全生产宣传标语
2014/06/06 职场文书
运动会跳远广播稿5篇
2014/09/17 职场文书
2014年高数考试作弊检讨书
2014/12/14 职场文书
销售工作决心书
2015/02/04 职场文书
教学副校长工作总结
2015/08/13 职场文书
一行代码python实现文件共享服务器
2021/04/22 Python
只用50行Python代码爬取网络美女高清图片
2021/06/02 Python