Python 从flask服务发出异步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

在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.
    # 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中完成。至少在几年前,你会被迫引入一些工作流程,比如芹菜,来完成类似的事情。这个问题似乎涵盖了所有问题:

也许这片土地的情况已经改变了