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?
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.
Commentaire le plus utile
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à.