Gunicorn: Pregunta sobre el proceso vinculado de IO con gevent Workers

Creado en 15 abr. 2019  ·  3Comentarios  ·  Fuente: benoitc/gunicorn

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?

Comentario más útil

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.

Todos 3 comentarios

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.

¿Fue útil esta página
0 / 5 - 0 calificaciones