gpt4 book ai didi

python - twisted:检查是否已经调用了 deferred

转载 作者:太空宇宙 更新时间:2023-11-03 23:49:02 27 4
gpt4 key购买 nike

这就是我想要完成的。我正在远程调用服务器以获取信息,我想阻止以等待信息。我创建了一个返回 Deferred 的函数,这样当 RPC 收到回复时,就会调用 deferred。然后我有一个从线程调用的函数,该线程执行 threads.blockingCallFromThread(reactor, deferredfunc, args)

如果出现问题 - 例如,服务器出现故障 - 那么调用将永远不会解除阻塞。在这些情况下,我更希望 deferred 异常结束。

我部分成功了。我有一个延迟的 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

这很好用。如果服务器宕机,连接丢失,并触发 errback。但是,如果服务器没有停机并且一切正常关闭,onConnectionLost 仍然会被触发,并且此处的匿名回调会尝试触发 errback,从而导致 AlreadyCalled 异常被抚养。

是否有任何巧妙的方法来检查是否已触发延迟?我想避免将它包装在 try/except block 中,但如果这是唯一的方法,我总是可以求助于它。

最佳答案

方法有很多,但你真的不应该这样做。触发 Deferred 的代码应该跟踪它是否在关联状态下触发了 Deferred。确实,当您启动 Deferred 时,您应该忘记它,以便它能够得到正确的垃圾收集;这样你就永远不需要担心调用它两次,因为你将不再有对它的引用。

此外,看起来您从调用 blockingCallFromThread 的同一线程调用 deferredfunc。不要那样做;返回 Deferreds 的函数最有可能调用 react 堆 API,而这些 API 不是线程安全的。事实上,Deferred 本身就不是线程安全的。这就是为什么它是阻塞CallFromThread,而不是blockOnThisDeferredFromThread。你应该做 blockingCallFromThread(reactor, deferredfunc, args)

如果你真的想要 errback-if-it's-been-called-otherwise-do-nothing 行为,你可能想要 cancel延迟。

关于python - twisted:检查是否已经调用了 deferred,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3337239/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com