Python线程,停止/启动/杀死

时间:2020-03-01 23:59:27

标签: python python-multithreading

在关于线程的Python文档(v3.8.2)中,有以下文字(第17章):“ Python的Thread类支持Java Thread类的行为的子集;目前,没有优先级,没有线程组,并且线程不能被破坏,停止,挂起,恢复或中断。”我一直没有受到优先级或分组线程的束缚,但是最后一点,“无法销毁,停止,暂停,暂停,恢复或中断”是一个问题。

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

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

1 个答案:

答案 0 :(得分:0)

在不受支持的操作中,它只是您应该想要的中断; Java长期以来一直不赞成使用其他impossible to use safely in general。由于Python甚至没有通用的中断接口(除了中断仅在 main 线程上产生KeyboardInterrupt,这不是很有用),因此必须避免使用{{3 }}支持也可检测线程间信号的版本。 (通常,成功杀死线程的方法也可以控制线程,因为它们涉及引起线程的注意,然后退出线程。 )

详细信息:

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