在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.
谢谢。
编辑:我正在尝试避免使用队列(例如芹菜)带来的额外复杂性。
答案 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
也许烧瓶地区发生了变化?