twisted:检查是否已经调用了延迟的

2024-10-01 11:25:14 发布

您现在位置:Python中文网/ 问答频道 /正文

这就是我要做的。我正在远程调用服务器以获取信息,我想阻止以等待信息。我创建了一个函数,它返回一个Deferred,这样当RPC带着应答进来时,Deferred被调用。然后我从一个线程调用了一个函数threads.blockingCallFromThread(reactor, deferredfunc, args)。在

如果出了问题-例如,服务器宕机-那么调用永远不会取消阻塞。在这种情况下,我更希望延期交货的人能有个例外。在

我部分成功了。我有一个延迟的,onConnectionLost,它在连接丢失时关闭。我修改了阻塞调用函数:

    deferred = deferredfunc(args)
    self.onConnectionLost.addCallback(lambda _: deferred.errback(
        failure.Failure(Exception("connection lost while getting run"))))
    result = threads.blockingCallFromThread(
        reactor, lambda _: deferred, None)
    return result

这个很好用。如果服务器宕机,连接将丢失,并触发错误返回。但是,如果服务器没有关闭并且所有的东西都干净地关闭,onConnectionLost仍然会被激发,并且这里的匿名回调试图触发errback,从而引发一个AlreadyCalled异常。在

有没有什么简单的方法来检查延迟的已经被解雇了?我不想把它包装在try/except块中,但如果这是唯一的方法,我总是可以使用它。在


Tags: 方法lambda函数服务器远程argsresultreactor
1条回答
网友
1楼 · 发布于 2024-10-01 11:25:14

有办法,但你真的不应该这么做。启动Deferred的代码应该跟踪它是否在关联状态下激发了Deferred。实际上,当您启动Deferred时,您应该会失去对它的跟踪,这样就可以正确地对其进行垃圾回收;这样您就不必担心调用它两次,因为您再也不会引用它了。在

另外,看起来您正在从调用deferredfunc的同一线程调用blockingCallFromThread。不要这样做;返回Deferreds的函数很可能调用reactor api,而这些api不是线程安全的。实际上,Deferred本身不是线程安全的。这就是为什么它是blockingCallFromThread,而不是{}。你应该做blockingCallFromThread(reactor, deferredfunc, args)。在

如果您真的想要errback,如果它被称为-other-do-nothing行为,那么您可能需要cancel延迟的。在

相关问题 更多 >