python stoppable sched在单独的线程中

问题描述 投票:0回答:1

我有一个来自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"
python python-3.x scheduling python-multithreading
1个回答
1
投票

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

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

另一种解决方案是强制将错误引发到某个线程中。这种方法实现起来比较简单,但可能会导致意外行为,并且线程代码越复杂,它就越危险。

import ctypes


ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, 0)

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

print self._thread_id

有关这方面的更多信息,请访问Tomer Filiba的thread2博客文章。

© www.soinside.com 2019 - 2024. All rights reserved.