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 sqlobject(mysql)中文乱码解决方法
Nov 14 Python
Python操作Mysql实例代码教程在线版(查询手册)
Feb 18 Python
python实现数通设备tftp备份配置文件示例
Apr 02 Python
在Python中调用ggplot的三种方法
Apr 08 Python
python 2.6.6升级到python 2.7.x版本的方法
Oct 09 Python
Python 对象中的数据类型
May 13 Python
Python基于QRCode实现生成二维码的方法【下载,安装,调用等】
Jul 11 Python
基于python中staticmethod和classmethod的区别(详解)
Oct 24 Python
Python自定义函数实现求两个数最大公约数、最小公倍数示例
May 21 Python
解决nohup执行python程序log文件写入不及时的问题
Jan 14 Python
python multiprocessing模块用法及原理介绍
Aug 20 Python
Python词云的正确实现方法实例
May 08 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
使用 eAccelerator加速PHP代码的目的
2007/03/16 PHP
php的memcache类分享(memcache队列)
2014/03/26 PHP
PHP中怎样防止SQL注入分析
2014/10/23 PHP
PHP执行linux命令常用函数汇总
2016/02/02 PHP
深入浅析PHP无限极分类的案例教程
2016/05/09 PHP
多广告投放代码 推荐
2006/11/13 Javascript
一段好玩的JavaScript代码
2006/12/01 Javascript
JavaScript实现的链表数据结构实例
2015/04/02 Javascript
javascript中setAttribute()函数使用方法及兼容性
2015/07/19 Javascript
javascript中递归函数用法注意点
2015/07/30 Javascript
NodeJS与HTML5相结合实现拖拽多个文件上传到服务器的实现方法
2016/07/26 NodeJs
使用jquery实现的循环连续可停顿滚动实例
2016/11/23 Javascript
JS实现的将html转为pdf功能【基于浏览器端插件jsPDF】
2018/02/06 Javascript
vue 做移动端微信公众号采坑经验记录
2018/04/26 Javascript
JavaScript使用享元模式实现文件上传优化操作示例
2018/08/07 Javascript
对vue2.0中.vue文件页面跳转之.$router.push的用法详解
2018/08/24 Javascript
基于Node.js的大文件分片上传示例
2019/06/19 Javascript
[14:20]刀塔大凶女神互压各路奇葩屌丝
2014/05/16 DOTA
Python中if __name__ == &quot;__main__&quot;详细解释
2014/10/21 Python
Python pickle模块用法实例分析
2015/05/27 Python
Python实现的双色球生成功能示例
2017/12/18 Python
Numpy中矩阵matrix读取一列的方法及数组和矩阵的相互转换实例
2018/07/02 Python
Python函数any()和all()的用法及区别介绍
2018/09/14 Python
Python使用scipy模块实现一维卷积运算示例
2019/09/05 Python
Jupyter安装链接aconda实现过程图解
2020/11/02 Python
用html5的canvas和JavaScript创建一个绘图程序的简单实例
2016/07/06 HTML / CSS
初级Java程序员面试题
2016/03/03 面试题
槐乡的孩子教学反思
2014/04/27 职场文书
公司会议策划方案
2014/05/17 职场文书
导师工作推荐信范文
2014/05/17 职场文书
国际贸易本科毕业生求职信
2014/09/26 职场文书
小班上学期幼儿评语
2014/12/30 职场文书
初一年级组工作总结
2015/08/12 职场文书
小学英语教师2015年度个人工作总结
2015/10/14 职场文书
Python中for后接else的语法使用
2021/05/18 Python
Python实现仓库管理系统
2022/05/30 Python