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中的anydbm模版和shelve模版使用指南
Jul 09 Python
Python实现TCP协议下的端口映射功能的脚本程序示例
Jun 14 Python
Python简单实现网页内容抓取功能示例
Jun 07 Python
Python 利用切片从列表中取出一部分使用的方法
Feb 01 Python
在python中将list分段并保存为array类型的方法
Jul 15 Python
python多线程共享变量的使用和效率方法
Jul 16 Python
python中的反斜杠问题深入讲解
Aug 12 Python
Python将视频或者动态图gif逐帧保存为图片的方法
Sep 10 Python
pytorch:model.train和model.eval用法及区别详解
Feb 20 Python
Python: tkinter窗口屏幕居中,设置窗口最大,最小尺寸实例
Mar 04 Python
python实现逻辑回归的示例
Oct 09 Python
详解python中的异常捕获
Dec 15 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
JAVA/JSP学习系列之六
2006/10/09 PHP
教你如何解密 “ PHP 神盾解密工具 ”
2014/06/20 PHP
javascript RadioButtonList获取选中值
2009/04/09 Javascript
js动态创建表格,删除行列的小例子
2013/07/20 Javascript
jQuery prev ~ siblings选择器使用介绍
2013/08/09 Javascript
jQuery中appendTo()方法用法实例
2015/01/08 Javascript
jQuery中replaceAll()方法用法实例
2015/01/16 Javascript
jQuery实现的向下图文信息滚动效果
2015/05/03 Javascript
JavaScript中的some()方法使用详解
2015/06/09 Javascript
JavaScript中的Promise使用详解
2015/06/24 Javascript
深入理解MVC中的时间js格式化
2016/05/19 Javascript
详解angular中通过$location获取路径(参数)的写法
2017/03/21 Javascript
详解Vue使用 vue-cli 搭建项目
2017/04/20 Javascript
xmlplus组件设计系列之树(Tree)(9)
2017/05/02 Javascript
AngularJS+bootstrap实现动态选择商品功能示例
2017/05/17 Javascript
解决vue的 v-for 循环中图片加载路径问题
2018/09/03 Javascript
浅谈vuex actions和mutation的异曲同工
2018/12/13 Javascript
基于 jQuery 实现键盘事件监听控件
2019/04/04 jQuery
js实现移动端tab切换时下划线滑动效果
2019/09/08 Javascript
vue实现浏览器全屏展示功能
2019/11/27 Javascript
VSCode launch.json配置详细教程
2020/06/18 Javascript
vant-ui框架的一个bug(解决切换后onload不触发)
2020/11/11 Javascript
[57:12]完美世界DOTA2联赛循环赛 Inki vs Matador BO2第一场 10.31
2020/11/02 DOTA
python网络编程学习笔记(五):socket的一些补充
2014/06/09 Python
Python的装饰器模式与面向切面编程详解
2015/06/21 Python
python编程之requests在网络请求中添加cookies参数方法详解
2017/10/25 Python
selenium设置proxy、headers的方法(phantomjs、Chrome、Firefox)
2018/11/29 Python
关于pytorch中全连接神经网络搭建两种模式详解
2020/01/14 Python
python3 中时间戳、时间、日期的转换和加减操作
2020/07/14 Python
CSS3 透明色 RGBA使用介绍
2013/08/06 HTML / CSS
借助HTML5 Canvas API制作一个简单的猜字游戏
2016/03/25 HTML / CSS
Derek Rose官网:英国高档睡衣、家居服和内衣品牌
2020/01/18 全球购物
世界上最大的铁人三项商店:Tri UK
2020/11/04 全球购物
物理教育专业毕业生推荐信
2013/11/03 职场文书
收银员的岗位职责范本
2014/02/04 职场文书
详解解Django 多对多表关系的三种创建方式
2021/08/23 Python