从Flask服务发出异步HTTP请求

时间:2018-08-09 18:49:09

标签: 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.

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.

谢谢。

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

1 个答案:

答案 0 :(得分: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

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

您的其他用例更难在纯Python中完成。至少在几年前,您会被迫引入诸如芹菜之类的工人程序来完成类似的工作。这个问题似乎涵盖了所有问题:

Making an asynchronous task in Flask

也许烧瓶地区发生了变化?