Python 从flask服务发出异步HTTP请求
在Gunicorn下运行的Python3.6 RESTful web服务中,我对异步有两种不同的需求 1) 我希望我的服务的一个路由能够向另一个HTTP服务发送HTTP请求,并且在不等待响应的情况下,将响应发送回调用我的服务的客户端 一些示例代码:Python 从flask服务发出异步HTTP请求,python,asynchronous,flask,gunicorn,Python,Asynchronous,Flask,Gunicorn,在Gunicorn下运行的Python3.6 RESTful web服务中,我对异步有两种不同的需求 1) 我希望我的服务的一个路由能够向另一个HTTP服务发送HTTP请求,并且在不等待响应的情况下,将响应发送回调用我的服务的客户端 一些示例代码: @route def fire_and_forget(): # Send request to other server without waiting # for it to send a response. # Retu
@route
def fire_and_forget():
# Send request to other server without waiting
# for it to send a response.
# Return my own response.
@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.
2) 我希望我的服务的另一个路由能够向其他HTTP服务发送2个或多个异步HTTP请求,并在我的服务发送响应之前等待它们全部响应
一些示例代码:
@route
def fire_and_forget():
# Send request to other server without waiting
# for it to send a response.
# Return my own response.
@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.
提前谢谢
编辑:我试图避免使用队列(例如芹菜)带来的额外复杂性。您可以在第二个用例中使用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中完成。至少在几年前,你会被迫引入一些工作流程,比如芹菜,来完成类似的事情。这个问题似乎涵盖了所有问题:
也许这片土地的情况已经改变了