У меня есть несколько разных потребностей в асинхронности в моем веб-сервисе RESTful Python 3.6 Flask, работающем под Gunicorn.
1) Я бы хотел, чтобы один из маршрутов моей службы мог отправлять HTTP-запрос в другую HTTP-службу и, не дожидаясь ответа, отправлять ответ обратно клиенту, который вызвал мою службу.
Пример кода:
@route
def fire_and_forget():
# Send request to other server without waiting
# for it to send a response.
# Return my own response.
2) Я бы хотел, чтобы еще один из маршрутов моей службы мог отправлять 2 или более асинхронных HTTP-запроса другим HTTP-службам и ждать, пока они все ответят, прежде чем моя служба отправит ответ.
Пример кода:
@route
def combine_results():
# Send request to service A
# Send request to service B
# Wait for both to return.
# Do something with both responses
# Return my own response.
Заранее спасибо.
Обновлено: я пытаюсь избежать дополнительной сложности использования очереди (например, сельдерея).






Вы можете использовать eventlets для второго варианта использования. Сделать это довольно просто:
import eventlet
providers = [EventfulPump(), MeetupPump()]
try:
pool = eventlet.GreenPool()
pile = eventlet.GreenPile(pool)
for each in providers:
pile.spawn(each.get, [], 5, loc) # call the interface method
except (PumpFailure, PumpOverride):
return abort(503)
results = []
for res in pile:
results += res
Вы можете заключить каждую из ваших конечных точек api в класс, реализующий «общий интерфейс» (в приведенном выше примере это метод get), и вы можете выполнять вызовы параллельно. Я просто помещаю их все в список.
Другой вариант использования сложнее реализовать на прямом питоне. По крайней мере, несколько лет назад вам пришлось бы ввести какой-то рабочий процесс, например сельдерей, чтобы сделать что-то подобное. Этот вопрос, кажется, охватывает все проблемы:
Создание асинхронной задачи во Flask
Возможно, что-то изменилось в стране флаконов?