1

テストメソッドから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番目(そして最後)の延期が呼び出されるまでブロックさせるにはどうすればよいですか?

4

2 に答える 2

2

self.Connect()inへの呼び出しはDoSomething()、まだ実行されていないDeferredを返すことになっています。これがinlineCallbacksの仕組みです。最初のコードConnect()が呼び出されているはずですが、最初のコードにヒットすると、yieldそのDeferredが呼び出し元に返されます。その後、AMQPチャネルが取得されると、そのDeferredが起動します。

Deferredが発生した後、DoSomething()呼び出しを...実行する必要があり、別のinlineCallbacksメソッドcを作成したくない場合は、通常の方法でDeferredを使用します。例:DoSomething()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 Deferredsの動作の詳細については、http://twistedmatrix.com/documents/current/core/howto/defer.htmlを参照してください。お役に立てれば。

于 2012-05-21T18:43:57.883 に答える
1

コードはほとんど不明確に見えます(特に4行目のインデント)。しかし、私がそれを正しく理解した場合、 self.Connect()呼び出しは遅延自体を返すため、次を使用する必要があります。

c =利回りself.Connect()

バックグラウンドで実行されないようにし、deferredResultc変数に返します。

于 2012-05-21T07:13:04.497 に答える