Wir haben eine Reihe von Jobs und Mitarbeitern, die diese Jobs nacheinander bearbeiten. Für jeden Job müssen wir einige Daten formatieren und eine HTTP-POST-Anforderung mit den Daten als Anforderungsnutzdaten ausgeben.Wie sende ich asynchrone HTTP-Anfragen einzeln in Python?
Wie kann jeder Mitarbeiter diese HTTP-POST-Anfragen asynchron in einer single-threaded, non-blocking Weise ausgeben? Die Antwort aus der Anfrage ist uns egal - wir wollen nur, dass die Anfrage so schnell wie möglich ausgeführt wird und der Mitarbeiter sofort zum nächsten Job wechselt.
Wir haben mit gevent
und die grequests
Bibliothek (siehe Why does gevent.spawn not execute the parameterized function until a call to Greenlet.join?) erkundet. Unsere Arbeiter Code sieht etwa so aus:
def execute_task(worker, job):
print "About to spawn request"
greenlet = gevent.spawn(requests.post, url, params=params)
print "Request spawned, about to call sleep"
gevent.sleep()
print "Greenlet status: ", greenlet.ready()
Die erste Print-Anweisung ausgeführt wird, aber die zweite und dritte Druck Aussagen nie gedruckt werden und die URL wird nie getroffen.
Wie können wir diese asynchronen Anforderungen ausführen?
Es gibt eine Standard-Bibliothek mit dem Namen [asyncore] (http://docs.python.org/2/library/asyncore.html), die für Ihren Anwendungsfall jedoch möglicherweise zu niedrig ist. – lucasg
Ich würde @georgesl auf dieser Seite zustimmen müssen, asyncore wäre ein großartiger Ort, um zu migrieren, weil es Ihnen bessere Flexibilität über Ihre Anwendung für die spätere Entwicklung gibt. Auch "http: // stackoverflow.com/questions/15753901/python-asyncore-client-socket-kann-nicht-determaine-connection-status/15754244 # 15754244" hier ist ein guter Anfang und ein Beispiel, wie es verwendet werden kann (siehe die Antwort auf meine Frage). Wenn nicht, müssten Sie es tatsächlich in mehreren Prozessen tun, selbst die "Unter" -Bibliotheken von Python werden es höchstwahrscheinlich für Sie fädeln, wenn Anfragen parallel gesendet werden können, das ist die Sache über Multi-Prozess – Torxed
Ihr gevent code sieht okay aus (und ein schneller Test sagt mir, es funktioniert ganz gut, ich benutze gevent 1.0b3). Ich denke, es hängt vom Kontext ab, in dem 'execute_task' aufgerufen wird. – robertklep