Gunicorn: Вопрос о процессе, связанном с вводом-выводом с работниками gevent

Созданный на 15 апр. 2019  ·  3Комментарии  ·  Источник: benoitc/gunicorn

Привет всем,

Я работаю над API, который отправляет несколько запросов, собирает результаты и объединяет результаты с некоторой обработкой и где-то возвращает ответ. Я использую Greenlet worker, потому что процесс явно привязан к вводу-выводу.

Из того, что я читал, каждый гринлет, обрабатывающий запросы пушки, будет действовать как поток, поэтому, когда когда-либо вызов блокировки ввода-вывода должен ждать ввода-вывода, гринлет будет блокироваться для этого конкретного запроса пушки. Так, например, в обработчике моего приложения (с использованием колбы, кстати) у меня есть несколько requests.get(...) которые блокируются до следующего 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)

Я мог бы использовать grequests, чтобы попытаться добавить больше параллелизма к обработчику, чтобы уменьшить задержку (это то, что я ищу). Но есть ли у вас какие-нибудь предложения, как это сделать?

Есть ли у вас предложения, как собрать несколько запросов?

Самый полезный комментарий

Я мог бы использовать grequests, чтобы попытаться добавить больше параллелизма в обработчик,

grequests.map() - это сокращенная версия фрагмента кода, который я предоставил выше.

В остальном grequests мало что делает. Он в первую очередь существует, чтобы обезьяны исправлять процесс при импорте, но Gunicorn уже делает это.

Все 3 Комментарий

В gevent есть пример параллельной отправки нескольких запросов и обработки только после того, как они будут выполнены.

(Ваш случай был бы немного другим, вы бы вернули response вместо того, чтобы печатать его, а затем объединить их.)

Но на самом деле мы можем пойти еще проще, используя Group.map api:

from gevent import pool

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

Я мог бы использовать grequests, чтобы попытаться добавить больше параллелизма в обработчик,

grequests.map() - это сокращенная версия фрагмента кода, который я предоставил выше.

В остальном grequests мало что делает. Он в первую очередь существует, чтобы обезьяны исправлять процесс при импорте, но Gunicorn уже делает это.

закрытие заявки, поскольку какое-то время с ней не происходило никаких действий.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги