我正在尝试循环调用线程中的函数。
这是我的代码:
from twisted.internet import reactor
from twisted.internet.task import LoopingCall
def func_that_cost_many_time():
...
looping_call = LoopingCall(func_that_cost_many_time)
reactor.callInThread(looping_call.start, 60)
reactor.run()
...
看起来
LoopingCall
在另一个线程中运行,第9行以下的代码可以运行。Received SIGINT, shutting down.
但应用程序仍在运行。
是我的代码有问题还是有更好的解决方案?
当我按下 Ctrl-C 时,
func_that_cost_many_time
任务应该停止。
您不能在非反应器线程中启动
LoopingCall
。通常,几乎没有可以在非反应器线程中使用的 Twisted API。您可以使用的那些都有清楚明确的标记。
由于您以不安全的方式使用了 Twisted API,因此您会得到一些任意行为,这些行为是由这样使用时如何破坏实现的细节引起的。
相反,您应该做的是正常启动
LoopingCall
并使其驱动的功能成为非阻塞的,也许通过在其中调用reactor.callInThread
(或者更好的是deferToThread
)来调用其他线程-安全的 API。