python stoppable计划在单独的线程

时间:2019-02-22 15:56:35

标签: python python-3.x scheduling python-multithreading

我有一个来自sched模块的python计划,我希望在一个单独的线程中执行,同时可以随时将其停止。我看过threading module,但不知道哪种方法是实现此目标的最佳方法。

时间表示例:

>>> s.run()
one
two
three
end

线程中调度的示例:

>>> t = threading.Thread(target = s.run)
>>> t.start()
one
two
>>> print("ok")
ok
three
end
>>>

想要的结果:

>>> u = stoppable_schedule(s.run)
>>> u.start()
>>>
one
two
>>> u.stop()
"schedule stopped"

1 个答案:

答案 0 :(得分:1)

您所描述的是可以异步停止的线程。

here所述,有两种主要方法。 其中之一是让线程代码检查其执行的每个操作是否有某个事件(在您的示例中由u.stop()触发)。

另一种解决方案是强制在某个线程中引发错误。这种方法更易于实现,但可能会导致意外行为,并且线程代码越复杂,它越危险。

import ctypes


ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, 0)

tid是要终止的线程。您可以通过运行(在线程中)获取线程ID:

print self._thread_id

有关更多信息,请参见Tomer Filiba的thread2博客文章。