这就是我要做的。我正在远程调用服务器以获取信息,我想阻止以等待信息。我创建了一个函数,它返回一个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
块中,但如果这是唯一的方法,我总是可以使用它。在
有办法,但你真的不应该这么做。启动
Deferred
的代码应该跟踪它是否在关联状态下激发了Deferred
。实际上,当您启动Deferred
时,您应该会失去对它的跟踪,这样就可以正确地对其进行垃圾回收;这样您就不必担心调用它两次,因为您再也不会引用它了。在另外,看起来您正在从调用}。你应该做
deferredfunc
的同一线程调用blockingCallFromThread
。不要这样做;返回Deferreds
的函数很可能调用reactor api,而这些api不是线程安全的。实际上,Deferred
本身不是线程安全的。这就是为什么它是blocking
Call
FromThread
,而不是{blockingCallFromThread(reactor, deferredfunc, args)
。在如果您真的想要errback,如果它被称为-other-do-nothing行为,那么您可能需要cancel延迟的。在
相关问题 更多 >
编程相关推荐