2

そこで、http://tavendo.com/blog/post/going-asynchronous-from-flask-to-twisted-klein/のガイドに従って、非同期 Web サービスを作成しました。

私のコードでは、次のようなリクエストを送信する関数がありました

def query(text):
    resp = yield treq.get("http://api.Iwanttoquery")
    content = yield treq.content(resp)
    returnValue(content)

@inlineCallbacks
def caller():
    output1 = yield query("one")
    output2 = yield query("two")

API への各クエリには通常約 3 秒かかるため、現在のコードでは 6 秒後に結果が返されます。2 つのクエリを同時に送信して、3 秒後に output1 と output2 の両方のコンテンツを取得できる方法はあるのでしょうか。ありがとう。

4

1 に答える 1

2

あなたがする必要があるのは、のDeferredList代わりに使用することですinlineCallbacks。基本的に、遅延オブジェクトのリストを提供し、それぞれが完了すると、すべての遅延オブジェクトの結果を含む最終コールバックが実行されます。

import treq
from twisted.internet import defer, reactor

def query(text):
    get = treq.get('http://google.com')
    get.addCallback(treq.content)
    return get

output1 = query('one')
output2 = query('two')

final = defer.DeferredList([output1, output2])  # wait for both queries to finish
final.addCallback(print)    # print the results from all the queries in the list

reactor.run()

query()関数はリクエストを同時に実行し、Deferred. これはほぼ即座に行われるため、基本的にoutput1output2は同時に実行されます。次に、 a の中に deferreds (つまりoutput1output2)を追加しlistて に渡します。DeferredListこれ自体が a を返しますDeferred。最後に、コールバックを に追加しDeferredListて、結果を処理します (この場合は結果を出力するだけです)。これはすべてスレッドを使用せずに行われます。これは私の意見では最高の部分です! これが理にかなっていることを願っています。そうでない場合はコメントしてください。

PS

Klein についてさらにサポートが必要な場合は、 https://github.com/notoriousno/klein-basicsでドキュメントの改訂に取り組んでいます(近いうちにブログを投稿したいと思います)。一部のドキュメント ( が付いているファイル.rst) を参照してください。私の恥知らずなプラグインはこれで終わりです:D

于 2016-07-15T00:04:34.377 に答える