Привет всем,
Я работаю над 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, чтобы попытаться добавить больше параллелизма к обработчику, чтобы уменьшить задержку (это то, что я ищу). Но есть ли у вас какие-нибудь предложения, как это сделать?
Есть ли у вас предложения, как собрать несколько запросов?
В 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 уже делает это.
закрытие заявки, поскольку какое-то время с ней не происходило никаких действий.
Самый полезный комментарий
grequests.map()
- это сокращенная версия фрагмента кода, который я предоставил выше.В остальном
grequests
мало что делает. Он в первую очередь существует, чтобы обезьяны исправлять процесс при импорте, но Gunicorn уже делает это.