微信号:Python_xiaowu

介绍:清华出版社《Python程序设计》系列教材作者董付国的Python小屋.介绍Python基础语法知识、标准库、扩展库知识,探讨Python在各领域的应用.

详解Python线程对象daemon属性对线程退出的影响

2019-04-06 16:32 董付国

进程、线程的概念以及多线程编程的基础知识请参考文末给出的方式在公众号历史文章中查找相关文章进行阅读。本文重点介绍线程对象daemon属性在线程退出时产生的作用和影响。

首先,我们来看一下官方文档对守护线程(daemon thread)的描述:


再来看一下官方文档对线程对象daemon属性的描述:

可知:

1)主线程不是守护线程,daemon属性的值为False;

2)新线程被创建时会继承父线程daemon属性的值;

3)主线程创建的所有子线程都默认daemon=False,如果要修改子线程daemon属性值,必须在调用start()方法启动线程之前进行;

4)主线程退出时会检查是否有daemon=False的子线程,如果有则延迟退出;如果当前所有子线程的daemon都是True,则主线程直接退出,同时所有daemon=True的子线程都会被强制结束;

5)所有daemon=True的子线程有可能遭遇被强制退出,其中的资源可能无法正确释放,从而有可能(但不一定)引发异常;

6)主线程结束也就意味着整个程序退出,进程结束。

以下面的代码为例,主线程创建并启动两个子线程之后,直接退出,两个daemon=True的子线程也被迫结束,但这时子线程可能正在向标准输出控制台输出内容,而当前进程已结束导致标准输出控制台被释放,子线程无法取得访问权限,从而引发异常,尽管每次引发异常的时机和位置并不一样。


运行状态如下图所示:


修改代码,在程序最后增加一句sleep(1),也就是主线程创建并启动两个daemon=True的子线程之后,等待一秒钟再退出,此时由于两个子线程都已输出完要输出的内容并进入sleep状态不再使用标准输出控制台的资源,所以子线程被强制结束时没有引发异常。


连续多次运行结果如下图所示,虽然结果仍不可再现(这样的结果对于没有使用同步机制的多线程程序是正常的),但没有抛出异常:

那么,如果调整子线程代码,使得先等待一段时间,在主线程退出时子线程还没有开始输出,结果会怎样呢?如下图所示,右边是调整后的代码,左侧是运行结果,主线程创建并启动两个线程之后等待一秒钟退出,此时两个子线程并没有尝试占用标准输出控制台的资源,被强制退出时没有引发异常。


再例如,下面的代码,主线程退出时强行结束两个子线程,子线程中申请的文件对象没有正确释放,文件中最终写入的内容不确定。



温馨提示

关注本公众号“Python小屋”,通过菜单“最新资源”==>“历史文章”可以快速查看分专题的800篇技术文章列表(可根据关键字在页面上搜索感兴趣的文章),通过“最新资源”==>“微课专区”可以免费观看300节Python微课,通过“最新资源”==>“培训动态”可以查看近期Python培训安排,通过“最新资源”==>“教学资源”可以查看Python教学资源。


--------董付国老师Python系列图书--------

1)《Python程序设计(第2版)》清华大学出版社


2)《Python可以这样学》清华大学出版社


3)《Python程序设计基础(第2版)》清华大学出版社

4)《中学生可以这样学Python》清华大学出版社,配套微课:《中学生可以这样学Python》84节微课免费观看地址


5)《Python程序设计开发宝典》清华大学出版社


6)《玩转Python轻松过二级》清华大学出版社


7)《Python程序设计基础与应用》机械工业出版社


8)《Python程序设计实验指导书》清华大学出版社


9)《Python编程基础与案例集锦(中学版)》电子工业出版社


《中学生可以这样学Python》84节微课免费观看地址

非计算机专业《Python程序设计基础》教学参考大纲

计算机相关专业“Python程序设计”教学大纲(参考)

《Python程序设计》实验指导书(30个实验)

《Python程序设计基础与应用》课后习题答案

Python课程期末考试编程题自动批卷原理与实现模板

“Python小屋”免费资源汇总(截至2018年11月28日)

Python课堂上我与学生斗智斗勇已8个学期


系列教学PPT:

1900页Python系列PPT分享一:基础知识(106页)

1900页Python系列PPT分享二:Python序列(列表、元组、字典、集合)(154页)

1900页Python系列PPT分享三:选择与循环结构语法及案例(96页)

1900页Python系列PPT分享四:字符串与正则表达式(109页)

1900页Python系列PPT分享五:函数设计与应用(134页)

1900页Python系列PPT分享六:面向对象程序设计(86页)

1900页Python系列PPT分享七:文件操作(132页)

1900页Python系列PPT分享八:异常处理结构与程序调试、测试(70页)

报告PPT(163页):基于Python语言的课程群建设探讨与实践

报告PPT(123页):Python编程基础精要

2000页Python系列PPT分享九:(GUI编程)(122页)

Python实验项目1例:使用进程池统计指定范围内素数的个数

(PPT)Python程序设计课程教学内容组织与教学方法实践


 
Python小屋 更多文章 Python基于值的内存管理真相 Python+pandas使用交叉表分析超市营业额数据 Python使用标准库itertools中count类求解数苹果问题 Python+tkinter生成自动跳转到网页的二维码 免费直播课|Python程序设计教学要点与教学方法
猜您喜欢 黑客马拉松需要什么样的创新项目 主从DB与cache一致性 思考,快与慢——第五章 2017人工智能计算大会来了,一起AI起来? 详解Python的Django框架中inclusion_tag的使用