Gunicorn: Pergunta sobre o processo vinculado IO com trabalhadores gevent

Criado em 15 abr. 2019  ·  3Comentários  ·  Fonte: benoitc/gunicorn

Olá a todos,

Estou trabalhando em uma API que envia várias solicitações, reúne os resultados e combina os resultados com algum processamento e retorna uma resposta em algum lugar. Estou usando o trabalhador greenlet porque o processo é claramente vinculado ao IO.

Pelo que li, cada greenlet que lida com as solicitações de gunicorn atuaria como um thread, portanto, sempre que uma chamada de bloqueio de IO tiver que esperar por IO, o greenlet será bloqueado para essas solicitações de gunicorn em particular. Então, por exemplo, no manipulador do meu aplicativo (usando o flask btw), eu tenho vários requests.get(...) o greenlet irá bloquear até o 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)

Eu poderia usar grequests para tentar adicionar mais simultaneidade ao manipulador, para melhorar a latência (que é algo que estou procurando). Mas você tem alguma sugestão de como fazer isso?

Você tem alguma sugestão de como fazer a coleta de vários pedidos?

Comentários muito úteis

Eu poderia usar grequests para tentar adicionar mais simultaneidade ao manipulador,

grequests.map() é uma versão abreviada do trecho de código que forneci acima.

Fora isso, grequests não faz muito. Ele existe principalmente para corrigir o processo quando é importado, mas o gunicorn já faz isso.

Todos 3 comentários

gevent tem um exemplo para despachar várias solicitações em paralelo e proceder apenas depois de concluídas.

(Seu caso seria um pouco diferente, você retornaria response vez de imprimi-lo e, em seguida, combiná-los.)

Mas podemos realmente ir ainda mais simples usando a Group.map api:

from gevent import pool

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

Eu poderia usar grequests para tentar adicionar mais simultaneidade ao manipulador,

grequests.map() é uma versão abreviada do trecho de código que forneci acima.

Fora isso, grequests não faz muito. Ele existe principalmente para corrigir o processo quando é importado, mas o gunicorn já faz isso.

fechando o ticket já que nenhuma atividade aconteceu nele por um tempo.

Esta página foi útil?
0 / 5 - 0 avaliações