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)
提前致谢。
编辑:我试图避免使用队列(例如芹菜)的额外复杂性。
您可以将 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)来完成类似的事情。这个问题似乎涵盖了所有问题:
也许烧瓶领域的情况已经发生了变化?