python - Python 线程,停止/启动/终止
问题描述
在 Python 的关于线程的文档(v3.8.2)中,有这样一段文字(第 17 章):“Python 的 Thread 类支持 Java 的 Thread 类行为的子集;目前,没有优先级,没有线程组,线程不能被销毁、停止、暂停、恢复或中断。” 我没有受到任何优先级或分组线程的阻碍,但最后一点,“不能被破坏、停止、暂停、恢复或中断”是一个问题。
我有一个应用程序,它启动一个线程将传感器数据发布到队列,另一个线程从该队列中提取传感器数据,然后将其发布到 curses 窗口。问题是,在某些情况下,由于配置更改等原因,线程对(在这种情况下始终是对)被新线程覆盖。直到现在,我一直在愚蠢的假设下删除线程对象:此操作将导致所述线程的破坏。我注意到应用程序中有一些奇怪的行为,这现在是有道理的,因为几个线程正试图将数据发布到同一个 curses 窗口对象。
改变我的方法,我将创建几个线程对,将它们视为坚不可摧的,根据需要更新它们的配置......但是我如何从主线程控制它们的执行?有最佳实践吗?我在想,创建几对模板线程,启动它们,并使用 threading.Condition() 或 threading.Event() 类来启动/停止每个线程内运行的代码,但是我如何传递关于什么的信息对每个正在运行的线程做什么?由于我没有这样做,我主要是通过 rtfm 的悠久传统来学习的;但是,示例和一些指导会有所帮助。我是否使用 threading.Event.is_set()?如果是这样,我如何从线程外部设置/清除内部标志?threading.Event() 对象是全局的,因此对线程可见,
解决方案
在不受支持的操作中,您应该只需要中断;Java 长期以来一直反对其他方法,因为它们通常无法安全使用。由于 Python 甚至缺少通用中断接口(除了中断仅KeyboardInterrupt
在主线程上产生 a,这不是很有用),因此您必须避免使用基本功能time.sleep
,例如支持也检测线程间信号的版本。(一般来说,杀死线程的成功方法也能够控制它,因为它们涉及引起线程的注意然后让它退出。)
细节:
- 删除对
Thread
对象的引用并不能杀死它:线程是垃圾收集的根源。 - 所有对象都在线程之间共享:这就是它们与进程的区别。(这并不是说线程通常使用它们对大量对象的理论访问,也不是说为了简单起见它们不应该最小化共享对象的数量。)
- 您调用的库可能会或可能不会提供接口来中断其长期运行的操作;例如,有些人会在收到“忽略”信号(如
SIGPIPE
.
推荐阅读
- python - 如何从 Windows 命令提示符运行 .py 文件?
- dialogflow-es - 验证后对话框流参数重新提示
- javascript - 在 create-react-app 中动态加载图像
- node.js - Puppeteer:Chrome 远程启动
- php - PHP变量链接?
- javascript - AngularJS如何重新初始化指令?
- python - 张量流中的批量图像增强
- windows - windows 10(64位)MongoDB 4.0.2安装完成后如何获取账户域和账户密码?
- php - 如何在不刷新页面的情况下将选择值传递给 php var
- excel - 公式栏值excel vba