在 twisted.internet.reactor 中循环调用?

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

我正在尝试循环调用线程中的函数。
这是我的代码:

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行以下的代码可以运行。
但是一旦我按下 Ctrl-C,我总是得到
Received SIGINT, shutting down.
但应用程序仍在运行。 是我的代码有问题还是有更好的解决方案?

当我按下 Ctrl-C 时,

func_that_cost_many_time
任务应该停止。

python multithreading twisted twisted.internet
1个回答
0
投票

您不能在非反应器线程中启动

LoopingCall
。通常,几乎没有可以在非反应器线程中使用的 Twisted API。您可以使用的那些都有清楚明确的标记。

由于您以不安全的方式使用了 Twisted API,因此您会得到一些任意行为,这些行为是由这样使用时如何破坏实现的细节引起的。

相反,您应该做的是正常启动

LoopingCall
并使其驱动的功能成为非阻塞的,也许通过在其中调用
reactor.callInThread
(或者更好的是
deferToThread
)来调用其他线程-安全的 API。

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