【Python】 如何优雅地终止 Python 中的线程

基本原理

在 Python 中,线程(Thread)是一种执行并行计算的基本单位。然而,有时候我们需要在特定条件下终止一个正在运行的线程。Python 的标准库 threading 并没有提供直接终止线程的方法,因为强制终止线程可能会导致资源泄露或数据不一致。因此,我们需要采用一种更为优雅的方式来实现线程的终止。

代码示例

示例 1:使用 Event 对象

Event 对象可以被用来作为线程终止的信号。当 Event 被设置为 set() 状态时,线程可以检查这个状态并安全地退出。

import threading
import time# 创建一个 Event 对象
stop_event = threading.Event()def worker():while not stop_event.is_set():print("Working...")time.sleep(1)print("Exiting worker thread.")# 创建并启动线程
worker_thread = threading.Thread(target=worker)
worker_thread.start()# 模拟一段时间后终止线程
time.sleep(5)
stop_event.set()
worker_thread.join()
示例 2:使用 Lock 对象

Lock 对象可以用来控制线程的执行流程,通过在循环中检查锁的状态来实现线程的终止。

import threading
import time# 创建一个 Lock 对象
stop_lock = threading.Lock()def worker():with stop_lock:while True:print("Working...")time.sleep(1)if stop_lock.locked():print("Exiting worker thread.")break# 创建并启动线程
worker_thread = threading.Thread(target=worker)
worker_thread.start()# 模拟一段时间后锁定锁并终止线程
time.sleep(5)
with stop_lock:worker_thread.join()
示例 3:使用 Thread 对象的 join 方法

虽然 join 方法本身不是用来终止线程的,但它可以确保主线程等待子线程安全退出。

import threading
import timedef worker():print("Worker thread is running.")time.sleep(5)print("Worker thread is finishing.")# 创建并启动线程
worker_thread = threading.Thread(target=worker)
worker_thread.start()# 使用 join 等待线程结束
worker_thread.join()
print("Worker thread has been joined and is now terminated.")

注意事项

  • 强制终止线程(例如使用 os._exit()sys.exit())是不推荐的,因为这会导致资源未被正确释放。
  • 使用信号量(如 EventLock)来控制线程的退出是一种更安全的做法。
  • 确保在线程中定期检查退出条件,以避免无限循环。
  • 在设计多线程程序时,考虑线程间的同步和互斥,避免竞态条件。

结论

虽然 Python 没有提供直接终止线程的机制,但通过使用 EventLock 等同步原语,我们可以以一种可控和安全的方式来终止线程。在设计多线程程序时,始终要考虑线程的生命周期管理,确保程序的健壮性和资源的正确释放。

>
> 【痕迹】QQ+微信朋友圈和聊天记录分析工具1.0.4 (1)纯Python语言实现,使用Flask后端,本地分析,不上传个人数据。
>
> (2)内含QQ、微信聊天记录保存到本地的方法,真正实现自己数据自己管理。
>
> (3)数据可视化分析QQ、微信聊天记录,提取某一天的聊天记录与大模型对话。
>
> 下载地址:https://www.alipan.com/s/x6fqXe1jVg1
>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/340478.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AC 800PEC 高性能控制系统GFD563A101 3BHE046836R0101

AC 800PEC 控制系统对于大功率整流器应用具有极快控制算法的高性能应用 –快速控制的周期时间范围为100 μs(微秒) 长期操作瞬变的循环至秒-要求专用控制设备。这就是为什么我们设计了AC 800PEC,扩展ABB著名的自动化技术来处理高速电力电子等过程的算法应用程序。 …

github有趣项目:Verilog在线仿真( DigitalJS+edaplayground)

DigitalJS https://github.com/tilk/digitaljs这个项目是一个用Javascript实现的数字电路模拟器。 它旨在模拟由硬件设计工具合成的电路 像 Yosys(这里是 Github 存储库),它有一个配套项目 yosys2digitaljs,它可以转换 Yosys 将文…

汽车IVI中控开发入门及进阶(二十四):杰发科技AC8015

前言: 在此之前的大部分时间,四维图新更多的是以图商的身份在业内出现,但现在四维图新图商之外的技术积累提现在了杰发科技身上,或者是从图商到汽车智能化一体解决方案供应商的角色转变。汽车智能化,可以简单的归为座舱智能化和智能驾驶两个板块。 随着汽车变得越来越智能…

04.docker的主要组成部分

docker体验 docker是传统的CS架构分为docker client和docker server,跟mysql一样 查看版本命令:docker version 查看docker下载的是社区版,ce代表社区 rpm -qa |grep docker 查看docker系统命令 docker system docker info(如果要做监控&#xff…

13. 《C语言》——【strlen函数的使用和模拟实现】

文章目录 前言strlen函数strlen函数的使用strlen函数的3种方法实现方法1方法2方法3 总结 前言 各位老板好~ , 今天我们讲解strlen函数如何去使用以及如何去模拟实现strlen函数。希望各位老板能够给一个点赞和一个大大的关注,感谢各位老板!str…

【翻译软件】CopyTranslator复制即翻译的外文辅助阅读翻译软件NO.102

使用平台:Windows/Linux/macOS 设置里选择翻译引擎和翻译API,谷歌翻译已经退出中国了,但还是提供了镜像地址 一、复制即翻译 只需要复制文本到剪贴板,就可以查看翻译结果 记得开启“自动粘贴”哦。 二、多段同时翻译 三、智能…

第二证券炒股知识:短线炒股技巧?

在股票商场上,出资者分为长线和短线这两大类,其中短线炒股存在以下技巧: 1、早盘集合竞价时刻上的技巧 早上集合竞价对短线出资者来说比较重要,其中早上集合竞价期间9:15-9:20之间出资者可以进行撤单操作&#xff0c…

新项目来了,JDK 17和JDK 21 该如何选择?

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

【机器学习数据挖掘】基于ARIMA 自回归积分滑动平均模型的销售价格库存分析报告 附完整python代码

资源地址:Python数据分析大作业 4000字 图文分析文档 销售分析 完整python代码 ​ 完整代码分析 同时销售量后1000的sku品类占比中(不畅销产品)如上,精品类产品占比第一,达到66.7%,其次是香化类产品&#…

【mysql】ssl_choose_client_version:unsupported protocol

起因:项目上的DolphinScheduler连接不上数据库,查看worker日志提到SSL协议问题: com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failureCaused by: java.io.EOFException: SSL peer shut down incorrectly 我…

SQL Developer 导入CSV数据

之前已经写过一篇文章:将文本文件导入Oracle数据库的简便方法:SQL Developer 本文是类似的,只不过使用的是官方提供的 CSV文件,确实是标准的CSV(comma separated values)。 COL1,COL2,COL3 "e40a9db…

记录岁月云明细账excel导出的性能优化

财务软件报表还是非常麻烦,因为使用excel最好的就是财务,但是通过java导出excel,使用easyexcel不用报表工具,不是这么容易。采用jprofile对一个导出操作进行监控,其中一家零售企业导出当月全部明细账,检测到…

Spark的性能调优——RDD

前言 RDD 是 Spark 对于分布式数据集的抽象,每一个 RDD 都代表着一种分布式数据形态。比如 lineRDD,它表示数据在集群中以行(Line)的形式存在;而 wordRDD 则意味着数据的形态是单词,分布在计算集群中。 参…

使用 Django Channels 构建实时聊天应用(包含用户认证和消息持久化)

文章目录 准备工作创建 Django 项目创建应用程序配置项目编写 Consumer编写路由创建 URL 路由运行应用用户认证消息持久化显示历史消息结论 Django Channels 是 Django 的一个扩展,允许在 Web 应用中添加实时功能,例如 Websockets、HTTP2 和其他协议。本…

图片在线改dpi如何操作?电脑上改图片dpi的简单技巧

对图片dpi有数值的要求,需要将图片分辨率调整到要求的数值才可以上传。对于图片尺寸大小修改的方法相信很多人都知道如何处理,那么图片dpi的数值的修改方法是什么样的呢?下面就来给大家分享一下修改dpi数值的具体操作技巧。 在电脑上打开压缩…

推荐ChatGPT4.0——Code Copilot辅助编程、Diagrams: Show Me绘制UML图、上传PDF并阅读分析

5月14日凌晨1点、太平洋时间的上午 10 点,OpenAI的GPT-4o的横空出世,再次巩固了其作为行业颠覆者的地位。GPT-4o的发布不仅仅是一个产品的揭晓,它更像是向世界宣告AI技术已迈入了一个全新的纪元,连OpenAI的领航者萨姆奥特曼也不禁…

MFC 使用sapi文字转换为语音

文章目录 添加头文件声明变量 添加头文件 声明变量 pSpVoice NULL; //默认构造函数中初始化为空 bool CChKBarSCCodeApp::InitSpVoice() {HRESULT hr ::CoInitialize(NULL); // COM初始化if (!SUCCEEDED(hr)){AfxMessageBox(_T("声音环境初始化失败!…

《科技和产业》是什么级别的期刊?是正规期刊吗?能评职称吗?

​问题解答 问:《科技和产业》是不是核心期刊? 答:不是,是知网收录的第一批认定学术期刊 问:《科技和产业》是什么级别的? 答:国家级。主管单位:中国科学技术协会 主办单位&…

Android电量优化,让你的手机续航更持久

节能减排,从我做起。一款Android应用如果非常耗电,是一定会被主人嫌弃的。自从Android手机的主人用了你开发的app,一天下来,也没干啥事,电就没了。那么他就会想尽办法找出耗电量杀手,当他找出后&#xff0c…

【Unity】使用Jenkins实现远程Unity打包

前言 很多时候,我们需要自动打包,比如下班了,我要出一个包明天早上用。比如每天夜里12点,我需要定时出一个稳定包。 这个时候就需要Jenkins了。 1.安装环境 安装 jenkins 之前,需要安装Java 。Java下载网站 ①下载…