从 Flask 服务发出异步 HTTP 请求

Tim*_*art 5 python asynchronous flask gunicorn

在 Gunicorn 下运行的 Python 3.6 Flask RESTful Web 服务中,我对异步有一些不同的需求。

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.
Run Code Online (Sandbox Code Playgroud)

2) 我希望我的服务的另一条路由能够向其他 HTTP 服务发送 2 个或更多异步 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.
Run Code Online (Sandbox Code Playgroud)

提前致谢。

编辑:我试图避免使用队列(例如芹菜)的额外复杂性。

Rob*_*kal 0

您可以将 eventlet 用于第二个用例。这很容易做到:

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
Run Code Online (Sandbox Code Playgroud)

您可以将每个 api 端点包装在一个实现“公共接口”的类中(上面是 get 方法),并且可以并行进行调用。我只是将它们全部放在一个列表中。

你的其他用例很难用直接的 python 来完成。至少在几年前,您将被迫引入某种工作流程(例如 celery)来完成类似的事情。这个问题似乎涵盖了所有问题:

在 Flask 中创建异步任务

也许烧瓶领域的情况已经发生了变化?