Gunicorn: Question sur le processus lié aux IO avec les travailleurs de gevent

Créé le 15 avr. 2019  ·  3Commentaires  ·  Source: benoitc/gunicorn

Bonjour à tous,

Je travaille sur une API qui envoie plusieurs requêtes, rassemble les résultats et combine les résultats avec certains traitements et renvoie une réponse quelque part. J'utilise le travailleur greenlet car le processus est clairement IO Bound.

D'après ce que j'ai lu, chaque greenlet gérant les demandes de gunicorn agirait comme un fil, donc chaque fois qu'un appel de blocage d'IO doit attendre IO, le greenlet bloquera pour ces demandes de gunicorn particulières. Ainsi, par exemple, dans le gestionnaire de mon application (en utilisant flask btw), j'ai plusieurs requests.get(...) le greenlet bloquera jusqu'au prochain requests.get()

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)

Je pourrais utiliser des grequests pour essayer d'ajouter plus de simultanéité au gestionnaire, pour améliorer la latence (ce que je recherche). Mais avez-vous une suggestion sur la façon de faire cela?

Avez-vous des suggestions sur la façon de faire le regroupement de plusieurs demandes?

Commentaire le plus utile

Je pourrais utiliser des grequests pour essayer d'ajouter plus de simultanéité au gestionnaire,

grequests.map() est une version abrégée de l'extrait de code que j'ai fourni ci-dessus.

A part ça, grequests ne fait pas grand chose. Il existe principalement pour patcher le processus lorsqu'il est importé, mais gunicorn le fait déjà.

Tous les 3 commentaires

gevent a un exemple pour envoyer plusieurs demandes en parallèle et ne procéder qu'une fois qu'elles sont terminées.

(Votre cas serait légèrement différent, vous renverriez le response au lieu de l'imprimer puis de les combiner.)

Mais nous pouvons en fait aller encore plus simple en utilisant l'api Group.map :

from gevent import pool

jobs = pool.Group()
responses = jobs.map(requests.get, 
                     ('http://one', 'http://two', 'http://three'))

Je pourrais utiliser des grequests pour essayer d'ajouter plus de simultanéité au gestionnaire,

grequests.map() est une version abrégée de l'extrait de code que j'ai fourni ci-dessus.

A part ça, grequests ne fait pas grand chose. Il existe principalement pour patcher le processus lorsqu'il est importé, mais gunicorn le fait déjà.

fermer le ticket car aucune activité ne s'est produite dessus depuis un certain temps.

Cette page vous a été utile?
0 / 5 - 0 notes