首页 > 编程语言 >详解Python线程对象daemon属性对线程退出的影响

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

时间:2023-06-10 16:35:24浏览次数:53  
标签:输出 daemon Python 主线 线程 退出 True


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

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

详解Python线程对象daemon属性对线程退出的影响_大数据

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

详解Python线程对象daemon属性对线程退出的影响_多进程_02

可知:

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

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

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

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

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

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

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

详解Python线程对象daemon属性对线程退出的影响_编程语言_03

运行状态如下图所示:

详解Python线程对象daemon属性对线程退出的影响_多进程_04

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

详解Python线程对象daemon属性对线程退出的影响_多进程_05

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

详解Python线程对象daemon属性对线程退出的影响_多进程_06

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

详解Python线程对象daemon属性对线程退出的影响_大数据_07

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

详解Python线程对象daemon属性对线程退出的影响_编程语言_08

公众号“Python小屋”

标签:输出,daemon,Python,主线,线程,退出,True
From: https://blog.51cto.com/u_9653244/6454786

相关文章

  • Python+pandas使用交叉表分析超市营业额数据
    交叉表是一种特殊的透视表,往往用来统计频次,也可以使用参数aggfunc指定聚合函数实现其他功能。扩展库pandas提供了crosstab()函数用来生成交叉表,返回新的DataFrame,其语法为:crosstab(index,columns,values=None,rownames=None,colnames=None,aggfunc=None,margins=False,dropn......
  • 这9个Python问题你能回答几个?
    周末了,一起开心开心。主要是想提醒一下,在和别人交流时应该详细描述问题,这一点真的非常非常非常重要。1、2、老师,我的代码可以运行,结果如下,我该怎么办?3、4、我的代码运行之后显示这个,请问怎么解决?5、6、怎么破,急,在线等。7、8、9、群里有人吗,谁能告诉我这个怎么办?公众号“Python小屋......
  • Python+pandas使用重采样技术按时间段查看员工业绩
    如果DataFrame结构的索引是日期时间数据,或者包含日期时间数据列,可以使用resample()方法进行重采样,实现按时间段查看员工业绩的功能。DataFrame结构的resample()方法语法为:resample(rule,how=None,axis=0,fill_method=None,closed=None,label=None,convention='start',kind=N......
  • Python快速判断若干整数是否互不相同
    让我们先来看一个简单的问题:给定两个整数x和y,如果这两个数不相等就输出Yes,否则输出No。遇到这样的问题,一般都会毫不犹豫地给出类似于下面的代码:如果问题性质不变,简单地增加一下问题规模:给定三个整数x、y和z,如果这三个数互不相等就输出Yes,否则输出No。估计很多人会在上面代码的基础......
  • 重要更新|《Python程序设计开发宝典》例12-7代码有bug
    下图是《Python程序设计开发宝典》第330页例12-7的代码,本意是使用多线程技术进行文件复制,重点演示嵌套函数定义、多线程编程技术以及队列在多线程同步时的用法。在代码中,使用内嵌函数add()创建一个线程负责往队列q中添加要复制的文件和文件夹名称,使用内嵌函数copy()创建多个线程负......
  • Python文件操作的几个要点与示例
    一般操作文件时,要么是读取其中的内容,要么是往里面写入新内容,但偶尔也会需要同时进行读写。Python内置函数在操作文本文件和自定义二进制文件时比较方便,该函数语法为:open(file,mode='r',buffering=-1,encoding=None,errors=None,newline=None,closefd=True,opener=None)其中......
  • Python使用标准库itertools中count类求解数苹果问题
    问题描述:有一箱苹果,4个4个地数最后余下1个,5个5个地数最后余下2个,9个9个地数最后余下7个。编写程序计算这箱苹果至少有多少个。解题思路:先确定除以9余7的最小整数,对这个数字重复加9,如果得到的数字除以5余2就停止;然后对得到的数字重复加45,如果得到的数字......
  • Python数据分析库pandas高级接口dt和str的使用
    Series对象和DataFrame的列数据提供了cat、dt、str三种属性接口(accessors),分别对应分类数据、日期时间数据和字符串数据,通过这几个接口可以快速实现特定的功能,非常快捷。本文重点介绍和演示dt和str的用法。DataFrame数据中的日期时间列支持dt接口,该接口提供了dayofweek、dayofyear、......
  • Python多进程使用队列共享数据协同判断素数
    感谢江西师范大学李雪斌老师提供素材和第一版本代码。问题描述:创建两个队列,qIn用来存储指定范围内的整数,qOut用来存放该范围内的所有素数。创建多个进程,每个进程依次从qIn队列中获取整数,并判断是否为素数,如果是素数则存入qOut。技术要点:1)使用Python标准库multiprocessing创建和管理......
  • Python测试序列是否所有相邻元素之间都具有升序关系
    代码功能:测试给定序列中是否所有相邻元素都具有严格的升序关系,也就是每个元素都比相邻的后面元素小。......