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实现Linux下守护进程的编写方法
Aug 22 Python
Python对象体系深入分析
Oct 28 Python
Python用list或dict字段模式读取文件的方法
Jan 10 Python
python 统计代码行数简单实例
May 04 Python
Python实现复杂对象转JSON的方法示例
Jun 22 Python
python中的常量和变量代码详解
Jul 25 Python
Python3爬虫学习之MySQL数据库存储爬取的信息详解
Dec 12 Python
Python3实现mysql连接和数据框的形成(实例代码)
Jan 17 Python
如何在Python对Excel进行读取
Jun 04 Python
基于Python+QT的gui程序开发实现
Jul 03 Python
用Python制作音乐海报
Jan 26 Python
解决python3安装pandas出错的问题
May 20 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
PHP_Flame(Version:Progress)的原代码
2006/10/09 PHP
php 什么是PEAR?(第二篇)
2009/03/19 PHP
php计算多个集合的笛卡尔积实例详解
2017/02/16 PHP
php + WebUploader实现图片批量上传功能
2019/05/06 PHP
Seajs的学习笔记
2014/03/04 Javascript
JavaScript onkeydown事件入门实例(键盘某个按键被按下)
2014/10/17 Javascript
JQuery中模拟image的ajaxPrefilter与ajaxTransport处理
2015/06/19 Javascript
七夕情人节丘比特射箭小游戏
2015/08/20 Javascript
js 实现数值的千分位及保存小数方法(推荐)
2016/08/01 Javascript
Bootstrap基本样式学习笔记之标签(5)
2016/12/07 Javascript
移动端效果之IndexList详解
2017/10/20 Javascript
NodeJS父进程与子进程资源共享原理与实现方法
2018/03/16 NodeJs
使用Vue组件实现一个简单弹窗效果
2018/04/23 Javascript
详解vue使用插槽分发内容slot的用法
2019/03/28 Javascript
jquery实现掷骰子小游戏
2019/10/24 jQuery
Vue + Scss 动态切换主题颜色实现换肤的示例代码
2020/04/27 Javascript
vue 组件之间事件触发($emit)与event Bus($on)的用法说明
2020/07/28 Javascript
Javascript中window.name属性详解
2020/11/19 Javascript
[43:24]2018DOTA2亚洲邀请赛3月29日 小组赛A组 LGD VS Liquid
2018/03/30 DOTA
使用Python脚本将文字转换为图片的实例分享
2015/08/29 Python
pycharm下查看python的变量类型和变量内容的方法
2018/06/26 Python
python 画出使用分类器得到的决策边界
2019/08/21 Python
PYTHON发送邮件YAGMAIL的简单实现解析
2019/10/28 Python
基于Tensorflow的MNIST手写数字识别分类
2020/06/17 Python
python 安装移动复制第三方库操作
2020/07/13 Python
Android本地应用打开方法——通过html5写连接
2016/03/11 HTML / CSS
html table呈现个人简历以及单元格宽度失效的问题解决
2021/01/22 HTML / CSS
李维斯德国官方网上商店:Levi’s德国
2016/09/10 全球购物
StubHub意大利:购买和出售全球演唱会和体育赛事门票
2017/11/21 全球购物
在校硕士自我鉴定
2014/01/23 职场文书
个人委托书范本
2014/04/02 职场文书
团队队名口号大全
2014/06/06 职场文书
互联网的下一个风口:新的独角兽将诞生
2019/08/02 职场文书
利用Python实现Picgo图床工具
2021/11/23 Python
MySQL 数据库 增删查改、克隆、外键 等操作
2022/05/11 MySQL
Linux下搭建SFTP服务器的命令详解
2022/06/25 Servers