2016-07-14 12 views
1

So folgte ich einem Leitfaden um http://tavendo.com/blog/post/going-asynchronous-from-flask-to-twisted-klein/, um einen asynchronen Web-Service zu erstellen.So senden Sie zwei Anfragen zur gleichen Zeit mit Python

in meinem Code, ich hatte eine Funktion, die die Anforderung wie

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

aussenden wird Da jede Anfrage an den api in der Regel etwa 3 Sekunden mit meinem aktuellen Code nehmen das Ergebnis nach 6 Sekunden zurückkommt. Ich frage mich, gibt es eine Möglichkeit, zwei Abfragen gleichzeitig zu senden, so dass ich nach 3 Sekunden den Inhalt von sowohl output1 und output2 bekommen kann? Vielen Dank.

+0

Sie könnten Threads verwenden oder einen Weg finden, die Abfragen in eine Abfrage zusammenzuführen – depperm

+0

Ihr "Problem" ist, dass Sie '' inlineCallbacks' verwenden, die (aus Mangel an besseren Wörtern) verhält sich wie synchroner Code. Also muss '' output1'' eigentlich einen Wert ergeben, bevor es zu '' output2'' weitergehen kann. –

Antwort

2

Was Sie tun müssen, ist ein DeferredList anstelle von inlineCallbacks zu verwenden. Im Grunde geben Sie eine Liste der Deferreds an und nach jedem Abschluss wird ein finaler Callback mit den Ergebnissen aller Deferred ausgeführt.

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() Jede Funktion wird ausgeführt Anforderungen gleichzeitig dann einen Deferred zurückzukehren. Dies geschieht fast sofort, so dass im Grunde output1 und output2 zur gleichen Zeit ausgeführt werden. Dann fügen Sie die Defereds (dh. output1 und output2) innerhalb einer list an und übergeben sie in DeferredList, die selbst eine Deferred zurückgibt. Schließlich fügen Sie einen Rückruf an die DeferredList hinzu, um etwas mit den Ergebnissen zu tun (in diesem Fall drucke ich sie einfach). Dies ist alles ohne den Einsatz von Threads, was meiner Meinung nach der beste Teil ist! Hoffe, das macht Sinn und bitte kommentieren, wenn es nicht so ist.

PS

Wenn Sie mit Klein weitere Hilfe benötigen, die Dokumentation arbeite ich hier https://github.com/notoriousno/klein-basics auf Modernisierungen (eine hoffentlich einen Blog-Post Ich werde in den nächsten Tagen machen). Bitte werfen Sie einen Blick auf einige der Dokumente (die Dateien mit .rst). Mein schamloser Stecker ist jetzt abgeschlossen: D