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常见数据结构详解
Jul 24 Python
Python函数的周期性执行实现方法
Aug 13 Python
Python多进程库multiprocessing中进程池Pool类的使用详解
Nov 24 Python
Python基于Flask框架配置依赖包信息的项目迁移部署
Mar 02 Python
python如何在列表、字典中筛选数据
Mar 19 Python
转换科学计数法的数值字符串为decimal类型的方法
Jul 16 Python
不到20行代码用Python做一个智能聊天机器人
Apr 19 Python
Mac在python3环境下安装virtualwrapper遇到的问题及解决方法
Jul 09 Python
python实现两个字典合并,两个list合并
Dec 02 Python
Python生成六万个随机,唯一的8位数字和数字组成的随机字符串实例
Mar 03 Python
安装python3.7编译器后如何正确安装opnecv的方法详解
Jun 16 Python
Python -m参数原理及使用方法解析
Aug 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
dedecms函数分享之获取某一栏目所有子栏目
2014/05/19 PHP
IIS下PHP的三种配置方式对比
2014/11/20 PHP
yii数据库的查询方法
2015/12/28 PHP
jquery 简单导航实现代码
2009/09/11 Javascript
在html页面上拖放移动标签
2010/01/08 Javascript
jQuery的写法不同导致的兼容性问题的解决方法
2010/07/29 Javascript
使用jQuery实现dropdownlist的联动效果(sharepoint 2007)
2011/03/30 Javascript
JavaScript访问CSS属性的几种方式介绍
2014/07/21 Javascript
JavaScript的设计模式经典之建造者模式
2016/02/24 Javascript
ReactNative Image组件使用详解
2017/08/07 Javascript
JavaScript获取移动设备型号的实现代码(JS获取手机型号和系统)
2018/03/10 Javascript
基于Vue实现图片在指定区域内移动的思路详解
2018/11/11 Javascript
axios携带cookie配置详解(axios+koa)
2018/12/28 Javascript
Vue切换Tab动态渲染组件的操作
2020/09/21 Javascript
js通过canvas生成图片缩略图
2020/10/02 Javascript
详解vue3.0 的 Composition API 的一种使用方法
2020/10/26 Javascript
跟老齐学Python之Python安装
2014/09/12 Python
Python2.x版本中基本的中文编码问题解决
2015/10/12 Python
python 系统调用的实例详解
2017/07/11 Python
Python2与python3中 for 循环语句基础与实例分析
2017/11/20 Python
Python脚本完成post接口测试的实例
2018/12/17 Python
python科学计算之scipy——optimize用法
2019/11/25 Python
Python将二维列表list的数据输出(TXT,Excel)
2020/04/23 Python
python实现邮件循环自动发件功能
2020/09/11 Python
Hotels.com英国:全球领先的酒店住宿提供商
2019/01/24 全球购物
男女钓鱼靴和甲板鞋:XTRATUF
2021/01/09 全球购物
C语言50道问题
2014/10/23 面试题
是否有自动比较结构的方法
2015/06/03 面试题
说一下Linux下有关用户和组管理的命令
2014/08/18 面试题
文员个人求职自荐信
2013/09/21 职场文书
优秀团员个人事迹材料
2014/01/29 职场文书
文化宣传方案
2014/03/13 职场文书
2014年党建工作总结
2014/11/11 职场文书
四年级数学上册教学计划
2015/01/20 职场文书
《搭石》教学反思
2016/02/18 职场文书
NoSQL优缺点与MongoDB数据库简介
2022/06/05 MongoDB