Hallo alle,
Ich arbeite an einer API, die mehrere Anfragen sendet, die Ergebnisse sammelt und die Ergebnisse mit etwas Verarbeitung kombiniert und irgendwo eine Antwort zurückgibt. Ich verwende den Greenlet-Worker, weil der Prozess eindeutig IO-gebunden ist.
Von dem, was ich gelesen habe, würde sich jedes Greenlet, das die Gunicorn-Anforderungen bearbeitet, wie ein Thread verhalten. Wenn also ein IO-Blockierungsaufruf auf IO warten muss, blockiert das Greenlet für diese bestimmten Gunicorn-Anforderungen. So habe ich zum Beispiel im Handler meiner App (mit Kolben übrigens) mehrere requests.get(...)
das Greenlet bis zum nächsten requests.get()
blockieren wird
def fetch(pid):
response0 = requests.get('http://some-micro-service-0.com/')
response1 = requests.get('http://some-micro-service-1.com/')
response2 = requests.get('http://some-micro-service-2.com/')
return combine_response(response0, response1, response2)
Ich könnte Grequests verwenden, um zu versuchen, dem Handler mehr Parallelität hinzuzufügen, um die Latenz zu verbessern (was ich suche). Aber haben Sie einen Vorschlag, wie das geht?
Haben Sie Vorschläge, wie Sie mehrere Anfragen sammeln können?
gevent hat ein Beispiel für das parallele Versenden mehrerer Anfragen und das Fortfahren erst, wenn sie fertig sind.
(Ihr Fall wäre etwas anders, Sie würden die response
anstatt sie auszudrucken, und sie dann kombinieren.)
Aber wir können mit der Group.map
API sogar noch einfacher vorgehen:
from gevent import pool
jobs = pool.Group()
responses = jobs.map(requests.get,
('http://one', 'http://two', 'http://three'))
Ich könnte Grequests verwenden, um zu versuchen, dem Handler mehr Parallelität hinzuzufügen,
grequests.map()
ist eine Kurzversion des Code-Snippets, das ich oben bereitgestellt habe.
Ansonsten macht grequests
nicht viel. Es existiert in erster Linie, um den Prozess beim Importieren mit Affen zu patchen, aber Gunicorn tut dies bereits.
Schließen des Tickets, da seit einiger Zeit keine Aktivität mehr darauf stattgefunden hat.
Hilfreichster Kommentar
grequests.map()
ist eine Kurzversion des Code-Snippets, das ich oben bereitgestellt habe.Ansonsten macht
grequests
nicht viel. Es existiert in erster Linie, um den Prozess beim Importieren mit Affen zu patchen, aber Gunicorn tut dies bereits.