首页 > 解决方案 > Python 线程,停止/启动/终止

问题描述

在 Python 的关于线程的文档(v3.8.2)中,有这样一段文字(第 17 章):“Python 的 Thread 类支持 Java 的 Thread 类行为的子集;目前,没有优先级,没有线程组,线程不能被销毁、停止、暂停、恢复或中断。” 我没有受到任何优先级或分组线程的阻碍,但最后一点,“不能被破坏、停止、暂停、恢复或中断”是一个问题。

我有一个应用程序,它启动一个线程将传感器数据发布到队列,另一个线程从该队列中提取传感器数据,然后将其发布到 curses 窗口。问题是,在某些情况下,由于配置更改等原因,线程对(在这种情况下始终是对)被新线程覆盖。直到现在,我一直在愚蠢的假设下删除线程对象:此操作将导致所述线程的破坏。我注意到应用程序中有一些奇怪的行为,这现在是有道理的,因为几个线程正试图将数据发布到同一个 curses 窗口对象。

改变我的方法,我将创建几个线程对,将它们视为坚不可摧的,根据需要更新它们的配置......但是我如何从主线程控制它们的执行?有最佳实践吗?我在想,创建几对模板线程,启动它们,并使用 threading.Condition() 或 threading.Event() 类来启动/停止每个线程内运行的代码,但是我如何传递关于什么的信息对每个正在运行的线程做什么?由于我没有这样做,我主要是通过 rtfm 的悠久传统来学习的;但是,示例和一些指导会有所帮助。我是否使用 threading.Event.is_set()?如果是这样,我如何从线程外部设置/清除内部标志?threading.Event() 对象是全局的,因此对线程可见,

标签: pythonpython-multithreading

解决方案


在不受支持的操作中,您应该只需要中断;Java 长期以来一直反对其他方法,因为它们通常无法安全使用。由于 Python 甚至缺少通用中断接口(除了中断仅KeyboardInterrupt线程上产生 a,这不是很有用),因此您必须避免使用基本功能time.sleep,例如支持也检测线程间信号的版本。(一般来说,杀死线程的成功方法也能够控制它,因为它们涉及引起线程的注意然后让它退出。)

细节:

  • 删除对Thread对象的引用并不能杀死它:线程是垃圾收集的根源
  • 所有对象都在线程之间共享:这就是它们与进程的区别。(这并不是说线程通常使用它们对大量对象的理论访问,也不是说为了简单起见它们不应该最小化共享对象的数量。)
  • 您调用的库可能会或可能不会提供接口来中断其长期运行的操作;例如,有些人会在收到“忽略”信号(如SIGPIPE.

推荐阅读