Hola a todos,
Estoy trabajando en una API que envía varias solicitudes, recopila los resultados y combina los resultados con algún procesamiento y devuelve una respuesta en alguna parte. Estoy usando el trabajador greenlet porque el proceso está claramente vinculado a IO.
Por lo que he leído, cada greenlet que maneja las solicitudes de gunicorn actuaría como un hilo, por lo que cuando una llamada de bloqueo de IO tiene que esperar IO, el greenlet se bloqueará para esas solicitudes de gunicorn en particular. Entonces, por ejemplo, en el controlador de mi aplicación (usando frasco por cierto), tengo varios requests.get(...)
el greenlet bloqueará hasta el próximo 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)
Podría usar grequests para intentar agregar más simultaneidad al controlador, para mejorar la latencia (que es algo que estoy buscando). ¿Pero tienes alguna sugerencia sobre cómo hacer esto?
¿Tiene alguna sugerencia sobre cómo realizar la recopilación de varias solicitudes?
gevent tiene un ejemplo para enviar múltiples solicitudes en paralelo y continuar solo una vez que hayan terminado.
(Su caso sería ligeramente diferente, devolvería response
lugar de imprimirlo y luego combinarlos).
Pero en realidad podemos hacerlo aún más simple usando la api Group.map
:
from gevent import pool
jobs = pool.Group()
responses = jobs.map(requests.get,
('http://one', 'http://two', 'http://three'))
Podría usar grequests para intentar agregar más simultaneidad al controlador,
grequests.map()
es una versión abreviada del fragmento de código que proporcioné anteriormente.
Aparte de eso, grequests
no hace mucho. Existe principalmente para parchear el proceso cuando se importa, pero gunicorn ya lo hace.
cerrando el ticket ya que no hubo actividad en él desde hace un tiempo.
Comentario más útil
grequests.map()
es una versión abreviada del fragmento de código que proporcioné anteriormente.Aparte de eso,
grequests
no hace mucho. Existe principalmente para parchear el proceso cuando se importa, pero gunicorn ya lo hace.