当前位置:
首页 > Python基础教程 >
-
python浅析守护线程与非守护线程的区别与使用
什么是守护线程
当主线程执行结束后,所有 在运行的子线程都 直接结束,不管子任务是否完成
很多语言的 垃圾收集器 就运用了 守护线程,去回收程序不再使用的垃圾内存
而非守护线程其实就跟守护线程相反,当主线程结束后,如果子线程还在运行,子线程并不会直接结束,而是 继续完成任务,等待子线程都执行完毕才结束
非守护线程
下面是一个普通线程的例子,也就是 非守护线程
我们创建了 autofelix 购物线程,去模拟购物流程的任务
可以看出当主线程已经结束,但是子线程依然 没有退出
因为 shopping 这个子线程任务还在工作,所以程序会一直运行下去
import threading
import time
def shopping():
while True:
print("飞兔小哥 进入了商场...'")
time.sleep(1)
if __name__ == '__main__':
autofelix = threading.Thread(target=shopping)
autofelix.start()
print('飞兔小哥 准备出去买东西...')
time.sleep(0.5)
print('飞兔小哥 看到了西红柿...')
time.sleep(0.5)
print('飞兔小哥 又买了土豆...')
time.sleep(0.5)
print('飞兔小哥 回家了!')
运行结果
飞兔小哥 进入了商场...'
飞兔小哥 准备出去买东西...
飞兔小哥 看到了西红柿...
飞兔小哥 又买了土豆...
飞兔小哥 进入了商场...'
飞兔小哥 回家了!
飞兔小哥 进入了商场...'
飞兔小哥 进入了商场...'
飞兔小哥 进入了商场...'
飞兔小哥 进入了商场...'
飞兔小哥 进入了商场...'
........
守护线程
我们可以通过设置 xxx.daemon = True 将线程变成守护线程
必须在启动之前将线程配置为守护程序或非守护程序,否则 python 将引发运行时错误
守护程序线程不会像普通线程一样正常退出,所以要确保,子任务的异常结束不会产生任何负面影响
import threading
import time
def shopping():
while True:
print("飞兔小哥 进入了商场...'")
time.sleep(1)
if __name__ == '__main__':
autofelix = threading.Thread(target=shopping)
autofelix.daemon = True
autofelix.start()
print('飞兔小哥 准备出去买东西...')
time.sleep(0.5)
print('飞兔小哥 看到了西红柿...')
time.sleep(0.5)
print('飞兔小哥 又买了土豆...')
time.sleep(0.5)
print('飞兔小哥 回家了!')
运行结果
飞兔小哥 进入了商场...'
飞兔小哥 准备出去买东西...
飞兔小哥 看到了西红柿...
飞兔小哥 进入了商场...'
飞兔小哥 又买了土豆...
飞兔小哥 回家了!
到此这篇关于python浅析守护线程与非守护线程的区别与使用的文章就介绍到这了,更多相关python守护线程内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持
原文链接:https://autofelix.blog.csdn.net/article/details/125915351
栏目列表
最新更新
详解MyBatis延迟加载是如何实现的
IDEA 控制台中文乱码4种解决方案
SpringBoot中版本兼容性处理的实现示例
Spring的IOC解决程序耦合的实现
详解Spring多数据源如何切换
Java报错:UnsupportedOperationException in Col
使用Spring Batch实现批处理任务的详细教程
java中怎么将多个音频文件拼接合成一个
SpringBoot整合ES多个精确值查询 terms功能实
Java使用poi生成word文档的简单实例
计算机二级考试MySQL常考点 8种MySQL数据库
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
uniapp/H5 获取手机桌面壁纸 (静态壁纸)
[前端] DNS解析与优化
为什么在js中需要添加addEventListener()?
JS模块化系统
js通过Object.defineProperty() 定义和控制对象
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比