Gunicorn: Frage zum IO-gebundenen Prozess mit gevent-Mitarbeitern

Erstellt am 15. Apr. 2019  ·  3Kommentare  ·  Quelle: benoitc/gunicorn

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?

Hilfreichster Kommentar

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.

Alle 3 Kommentare

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.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen