扭曲:等待所有延迟发射

时间:2012-05-20 22:44:00

标签: python twisted trial

当我从我的测试方法中调用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

我如何让它阻止直到第二个(和最后一个)延迟被调用?

2 个答案:

答案 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 变量。