Выполнение асинхронных HTTP-запросов из службы фляги

У меня есть несколько разных потребностей в асинхронности в моем веб-сервисе 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.

Заранее спасибо.

Обновлено: я пытаюсь избежать дополнительной сложности использования очереди (например, сельдерея).

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
4
0
1 896
1

Ответы 1

Вы можете использовать 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

Возможно, что-то изменилось в стране флаконов?

Другие вопросы по теме