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实现图片批量剪切示例
Mar 25 Python
Python中自定义函数的教程
Apr 27 Python
pyenv命令管理多个Python版本
Mar 26 Python
python网络爬虫学习笔记(1)
Apr 09 Python
python实现的分层随机抽样案例
Feb 25 Python
Python生成六万个随机,唯一的8位数字和数字组成的随机字符串实例
Mar 03 Python
keras做CNN的训练误差loss的下降操作
Jun 22 Python
Python类成员继承重写的实现
Sep 16 Python
Python读写锁实现实现代码解析
Nov 28 Python
Python如何实现感知器的逻辑电路
Dec 25 Python
Python爬虫之Selenium库的使用方法
Jan 03 Python
Autopep8的使用(python自动编排工具)
Mar 02 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实现浏览器点击下载TXT文档的方法详解
2013/06/02 PHP
PHP实现链式操作的核心思想
2015/06/23 PHP
PHP生成随机密码方法汇总
2015/08/27 PHP
让alert不出现弹窗的两种方法
2014/05/18 Javascript
Javascript无参数和有参数类继承问题解决方法
2015/03/02 Javascript
jQuery实现不断闪烁文字的方法
2015/05/15 Javascript
论Bootstrap3和Foundation5网格系统的异同
2016/05/16 Javascript
深入理解Ajax的get和post请求
2016/06/02 Javascript
原生JS实现小小的音乐播放器
2017/10/16 Javascript
vuejs 动态添加input框的实例讲解
2018/08/24 Javascript
uni-app之APP和小程序微信授权方法
2019/05/09 Javascript
Vue的生命周期操作示例
2019/09/17 Javascript
微信小程序实现同时上传多张图片
2020/02/03 Javascript
JS写滑稽笑脸运动效果
2020/05/28 Javascript
javascript操作向表格中动态加载数据
2020/08/27 Javascript
JavaScript实现10秒后再次获取验证码
2020/12/02 Javascript
[04:32]玩具屠夫中文语音节选
2020/08/23 DOTA
python抓取网页中的图片示例
2014/02/28 Python
python检查序列seq是否含有aset中项的方法
2015/06/30 Python
matplotlib设置legend图例代码示例
2017/12/19 Python
Python输入二维数组方法
2018/04/13 Python
详解Django-channels 实现WebSocket实例
2019/08/22 Python
python队列原理及实现方法示例
2019/11/27 Python
python实现将列表中各个值快速赋值给多个变量
2020/04/02 Python
virtualenv介绍及简明教程
2020/06/23 Python
tensorflow 大于某个值为1,小于为0的实例
2020/06/30 Python
Python 远程开关机的方法
2020/11/18 Python
Python实现我的世界小游戏源代码
2021/03/02 Python
会计专业自我鉴定范文
2013/12/29 职场文书
草船借箭教学反思
2014/02/03 职场文书
党的生日演讲稿
2014/09/10 职场文书
2015年复活节活动总结
2015/02/27 职场文书
爱的教育观后感
2015/06/17 职场文书
学校运动会感想
2015/08/10 职场文书
pytorch model.cuda()花费时间很长的解决
2021/06/01 Python
Nginx源码编译安装过程记录
2021/11/17 Servers