【问题标题】:Python - Stopping a long running taskq's threadPython - 停止长时间运行的taskq的线程
【发布时间】:2017-01-19 19:36:52
【问题描述】:

我有一个相当简单的程序,每个添加到 taskq 的任务都在执行和计算一些东西,比如 30 秒。此任务“未”在某种 while 或 for 循环中运行。

def run(self):
    while not self.stopper.is_set():
        DO_MY_30_SECONDS_WORK(self)
        self.task_done()

现在,假设我有一个 thread.event,这可以在任务完成之前/之后检查。但是有没有办法告诉已经运行的线程停止或退出它的执行。

【问题讨论】:

  • 我遇到了与您去年类似的问题,并使用 SIGNAL 来解决问题。您可以使用您的主线程启动另一个线程,并在辅助线程中启动一个时间计数器。当计数器完成时,向主线程发出信号并通过在其中获取信号来终止它。你可能想看看this
  • 你的任务是一些python代码,还是你使用subprocess运行的另一个程序?
  • 这只是 python 代码,但可能使用 Curl 调用..
  • 嘿,作者,你得到答案了吗?如果可能的话,停止一个正在运行的线程,如果不是由循环组成的单行在两者之间突然停止

标签: python multithreading python-2.7 threadpool


【解决方案1】:

如果DO_MY_30_SECONDS_WORK(self) 阻塞,则无法停止正在运行的线程。可以说你可以将它设置为daemon 线程,当你的主程序执行完成时它会被突然杀死,如果线程实际上正在持有资源(例如写入文件),这会导致问题并且通常不是一个好主意完成一个线程。

你可以做的是重新设计DO_MY_30_SECONDS_WORK(self)并使其成为非阻塞的,这意味着将工作切成小块并使其在合理的间隔内检查停止标志,以便你的线程足够响应当你告诉它这样做时,它会自行完成。

【讨论】:

  • 谢谢...是的,这就是我想要的。我只是把它切成小块。
猜你喜欢
  • 1970-01-01
  • 2010-11-12
  • 1970-01-01
  • 1970-01-01
  • 2014-02-11
  • 2018-06-03
  • 1970-01-01
  • 2012-03-15
  • 1970-01-01
相关资源
最近更新 更多