python中的异步回调函数

时间:2014-06-23 07:28:42

标签: python asynchronous

我正在尝试使用flask在python中实现REST API。但是,API实现又需要进行一些网络调用(例如db)。为了提高吞吐量,我可以使这个异步吗?我的意思是这个。让我们假设REST API是foo()

def foo():
    # 1. do stuff as needed
    # 2. call make_network_call and wait for it to return.
    # 3. do stuff as needed with returned data.
    # 4. return.

现在,如果我知道它需要花费一些时间在第2步,我可以在这里放弃cpu并处理其他传入的请求,并在它返回时返回它吗?如果是这样,我该怎么做以及涉及哪些框架?我目前正在使用带有烧瓶的python。

3 个答案:

答案 0 :(得分:1)

Flask可以在启动时使用多个线程或进程运行,请参阅this question。它不会使foo()更有效率,但您将能够同时为多个客户提供服务。

要使用多个线程或进程运行它,您可以在Flask.run()关键字中指定:

代表线程:

if __name__ == '__main__':
    app.run(threaded=True)

或者对于流程:

if __name__ == '__main__':
    app.run(processes=5) # Or however many you you may want.

答案 1 :(得分:1)

如果您使用的是最近的(> = 3.2)版本的Python,则可以使用concurrent.futures。那看起来像是:

from concurrent.futures import ThreadPoolExecutor

def other_func():
    with ThreadPoolExecutor as executor:
        future = executor.submit(foo)
        # do other stuff
        return future.result()

答案 2 :(得分:1)

看看Klein - 它是一个烧瓶/绞合混合物 - 加捻是一种异步反应器模式框架,其工作水平低于烧瓶中的水平。

Klein就像一个扭曲之上的包装器,就像Flask一样 - 允许你使用反应器编写deffered代码。

https://github.com/twisted/klein