当我从我的测试方法中调用DoSomething()方法时,我希望它阻止Connect()中的yield,但它没有,它返回一个未调用的延迟。
Class Foo:
@defer.inlineCallbacks
def Connect(self):
amqpConfig = AmqpConfig(self.config.getConfigFile())
self.amqp = AmqpFactory(amqpConfig)
try:
# First Deferred
d = self.amqp.connect()
# Second Deferred
d.addCallback(lambda ign: self.amqp.getChannelReadyDeferred())
# Block until connecting and getting an AMQP channel
yield d
except Exception, e:
self.log.error('Cannot connect to AMQP broker: %s', e)
def DoSomething(self):
c = self.Connect()
# None of the deferreds were fired, c.called is False
我如何让它阻止直到第二个(和最后一个)延迟被调用?
答案 0 :(得分:2)
您对self.Connect()
中DoSomething()
的来电假设以返回尚未解雇的延迟;这就是inlineCallbacks的工作原理。应该调用Connect()
开头的代码,但是一旦它到达第一个yield
,它就会将其延迟返回给您的调用者。稍后,当获得AMQP频道时,Deferred将触发。
如果您想在DoSomething()
延迟触发后c
调用...执行某些操作:),并且您不希望将DoSomething()
转换为另一个inlineCallbacks方法,则只需以正常方式使用延迟:addCallback()
和朋友。例如:
def DoSomething(self):
c = self.Connect()
c.addCallback(self.handle_getting_amqp_channel)
c.addErrback(self.this_gets_called_if_something_went_wrong)
return c
有关Twisted Deferred如何工作的详细信息,请参阅http://twistedmatrix.com/documents/current/core/howto/defer.html。希望这会有所帮助。
答案 1 :(得分:1)
代码似乎有点不清楚(特别是第4行缩进)。 但是,如果我做对了 self.Connect()调用返回 延迟本身,那么你将不得不使用:
c = 产量 self.Connect()
为了防止它在后台运行并将 deferredResult 返回到 c 变量。