0

これは、「Twisted Network Programming Essential」の例です。

from twisted.internet import reactor
from twisted.internet.defer import Deferred
from twisted.internet.protocol import Protocol
from twisted.web.client import Agent

import sys

from random import random

class ResourcePrinter(Protocol):
    def __init__(self, finished):
        self.finished = finished

    def dataReceived(self, data):
        print data

    def connectionLost(self, reason):
        self.finished.callback(None)

def printResource(response):
    # Nothing added to this 'finished'
    finished = Deferred()
    response.deliverBody(ResourcePrinter(finished))
    return finished

def printError(failure):
    print >>sys.stderr, failure

def stop(result):
    reactor.stop()

if len(sys.argv) != 2:
    print >>sys.stderr, 'Usage'
    exit(1)

agent = Agent(reactor)
d = agent.request('GET', sys.argv[1])
d.addCallbacks(printResource, printError)
d.addBoth(stop)

reactor.run()

しかし、 in で呼び出されることはないのに、最終的に in で呼び出されるaddCallback()finishedprintResource()なぜでしょうか?stop()connectionLost()

4

2 に答える 2

2

これは、 http://twistedmatrix.com/documents/current/core/howto/defer.html#auto13に記載されている「連鎖」と呼ばれる機能を使用しています。

于 2013-06-02T14:37:15.533 に答える
-1

実際には、これ以上コールバックを追加する必要はありません。すでに聞いていることが追加されました:

self.finished.callback(None)

だから、もっと注意深く見てみましょう。コード ポインターが次のように到達します。

d.addCallbacks(printResource, printError)

printResource コード ブロックを見ると、戻り値としてdeferredが返されます。したがって、この遅延オブジェクトが結果を取得するまで、データ配信は接続が失われたイベント (プロトコルのオーバーライドされたメソッドによってキャッチされる) を取得するまで続き、最後のステップまたはコールバックによって終了 (遅延) オブジェクトが発生し、その結果が返されます。

Main deferred -> add callback -> callback by coming responses-> |
                                                                |
                                                                 -> new deferred -> Receiving data ... til con lost -> add callaback (get result directly)|
                                                                                                                                                          |-> add last callback > stop

重要な点は、戻り値が deferred の場合、この deferred オブジェクトの結果を取得するまで、メイン フローは続行されないことです。

于 2014-06-08T23:28:02.387 に答える