这就是我想要完成的。我正在远程调用服务器以获取信息,我想阻止以等待信息。我创建了一个返回 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
这工作正常。如果服务器宕机,则连接丢失,并触发 errback。但是,如果服务器没有宕机并且所有东西都干净地关闭了,onConnectionLost
仍然会被触发,并且这里的匿名回调会尝试触发 errback,从而引发AlreadyCalled
异常。
有没有什么巧妙的方法来检查一个 deferred 是否已经被解雇了?我想避免将它包装在一个try/except
块中,但如果这是唯一的方法,我总是可以诉诸于此。