Python 个线程,stopping/starting/killing
Python threads, stopping/starting/killing
在 Python 关于线程的文档 (v3.8.2) 中,有这段文字(第 17 章):"Python’s Thread class supports a subset of the behavior of Java’s Thread class; currently, there are no priorities, no thread groups, and threads cannot be destroyed, stopped, suspended, resumed, or interrupted." 我没有被优先级排序所阻碍,或者分组线程,但最后一点 "cannot be destroyed, stopped, suspended, resumed, or interrupted" 是一个问题。
我有一个应用程序启动一个线程 post 传感器数据到队列,另一个线程从该队列中提取传感器数据,然后 post 它到 curses window.问题是,在某些情况下,由于配置更改等原因,线程对(在这种情况下它们总是成对)被新线程覆盖。直到现在,我一直在愚蠢的假设下删除线程对象此操作将导致所述线程的破坏。我注意到应用程序中出现了一些奇怪的行为,这现在是有道理的,因为多个线程正试图 post 将数据发送到同一个 curses window 对象。
改变我的方法,我将创建几个线程对,将它们视为坚不可摧,根据需要更新它们的配置...但是我如何从主线程控制它们的执行?有最佳实践吗?我在想,创建几对模板线程,启动它们,并使用 threading.Condition() 或 threading.Event() class 到 start/stop 每个线程内的代码运行,但是如何将有关要做什么的信息传递给每个 运行 线程?由于我还没有这样做,所以我主要是通过 rtfm 的历史悠久的传统来学习的;但是,示例和一些指导会有所帮助。我使用 threading.Event.is_set() 吗?如果是这样,我如何 set/clear 来自线程外部的内部标志? threading.Event() 对象是全局的,因此对线程可见,还是我需要使 Event() 对象成为线程执行的函数的参数之一,然后让线程函数评估 Event( ) 和 set/clear 它在主线程中?
在不受支持的操作中,只有中断是您应该想要的; Java 长期以来一直反对其他版本 impossible to use safely in general. Since Python lacks even the generic interrupt interface (except that an interrupt produces a KeyboardInterrupt
on the main thread only, which is not very useful), you have to avoid basic functions like time.sleep
支持也检测线程间信号的版本。 (一般来说,杀死一个线程的成功方法也能够控制它,因为它们涉及到引起线程的注意然后它退出。)
详情:
- 删除对
Thread
对象的引用无法杀死它:线程是垃圾收集的 根 。
- 所有对象在线程之间共享:这就是它们与进程的区别。 (这并不是说线程通常 使用 它们理论上对大量对象的访问,也不是说它们不应该 最小化 数量为简单起见共享对象。)
- 您调用的库可能提供也可能不提供中断其长运行 操作的接口;例如,有些人会在收到像
SIGPIPE
. 这样的“忽略”信号时优雅地 return 控制你
在 Python 关于线程的文档 (v3.8.2) 中,有这段文字(第 17 章):"Python’s Thread class supports a subset of the behavior of Java’s Thread class; currently, there are no priorities, no thread groups, and threads cannot be destroyed, stopped, suspended, resumed, or interrupted." 我没有被优先级排序所阻碍,或者分组线程,但最后一点 "cannot be destroyed, stopped, suspended, resumed, or interrupted" 是一个问题。
我有一个应用程序启动一个线程 post 传感器数据到队列,另一个线程从该队列中提取传感器数据,然后 post 它到 curses window.问题是,在某些情况下,由于配置更改等原因,线程对(在这种情况下它们总是成对)被新线程覆盖。直到现在,我一直在愚蠢的假设下删除线程对象此操作将导致所述线程的破坏。我注意到应用程序中出现了一些奇怪的行为,这现在是有道理的,因为多个线程正试图 post 将数据发送到同一个 curses window 对象。
改变我的方法,我将创建几个线程对,将它们视为坚不可摧,根据需要更新它们的配置...但是我如何从主线程控制它们的执行?有最佳实践吗?我在想,创建几对模板线程,启动它们,并使用 threading.Condition() 或 threading.Event() class 到 start/stop 每个线程内的代码运行,但是如何将有关要做什么的信息传递给每个 运行 线程?由于我还没有这样做,所以我主要是通过 rtfm 的历史悠久的传统来学习的;但是,示例和一些指导会有所帮助。我使用 threading.Event.is_set() 吗?如果是这样,我如何 set/clear 来自线程外部的内部标志? threading.Event() 对象是全局的,因此对线程可见,还是我需要使 Event() 对象成为线程执行的函数的参数之一,然后让线程函数评估 Event( ) 和 set/clear 它在主线程中?
在不受支持的操作中,只有中断是您应该想要的; Java 长期以来一直反对其他版本 impossible to use safely in general. Since Python lacks even the generic interrupt interface (except that an interrupt produces a KeyboardInterrupt
on the main thread only, which is not very useful), you have to avoid basic functions like time.sleep
支持也检测线程间信号的版本。 (一般来说,杀死一个线程的成功方法也能够控制它,因为它们涉及到引起线程的注意然后它退出。)
详情:
- 删除对
Thread
对象的引用无法杀死它:线程是垃圾收集的 根 。 - 所有对象在线程之间共享:这就是它们与进程的区别。 (这并不是说线程通常 使用 它们理论上对大量对象的访问,也不是说它们不应该 最小化 数量为简单起见共享对象。)
- 您调用的库可能提供也可能不提供中断其长运行 操作的接口;例如,有些人会在收到像
SIGPIPE
. 这样的“忽略”信号时优雅地 return 控制你