2016-07-14 20 views
1

私はhttp://tavendo.com/blog/post/going-asynchronous-from-flask-to-twisted-klein/のガイドに従って非同期Webサービスを作成していました。私のコードでPythonで同時に2つのリクエストを送信する方法

は、私は、APIへの各クエリは通常約3秒かかるので、私の現在のコードの結果は、6秒後に戻ってくると、

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") 

のような要求を送信する関数を持っていました。私は同時に2つのクエリを送信する方法があるので、3秒後にoutput1とoutput2の両方の内容を取得できますか?ありがとう。

+0

スレッドを使用してクエリを1つのクエリにマージする方法を見つける – depperm

+0

あなたの "問題"は、あなたが "inlineCallbacks"を使っていることです(より良い単語がないためです)同期コードのように動作します。したがって、基本的に '' output1''は '' output2''に進む前に値を返す必要があります。 –

答えて

2

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

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が同時に実行されています。次に、listの中に延期(つまり、output1output2)を追加し、DeferredListにそれを渡します。それ自体はDeferredを返します。最後に、DeferredListにコールバックを追加して結果を出力します(この場合は印刷します)。これはすべてスレッドの使用なしで行われますが、これは私の意見では最高の部分です!これが理にかなっていると思っています。あなたはクラインとさらにヘルプが必要な場合、私はここにhttps://github.com/notoriousno/klein-basicsをドキュメントを刷新に取り組んでいます

PS

(うまくいけば、私はブログの記事、これらの日の1作ります)。いくつかのドキュメント(.rstのファイル)を見てください。 D