Python中的异步回调函数

0 投票
3 回答
1176 浏览
提问于 2025-04-18 10:44

我正在用Python和Flask实现一个REST API。不过,这个API在实现过程中需要进行一些网络请求(比如访问数据库)。为了提高处理速度,我可以让它变成异步的吗?我的意思是这样的:假设这个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.

现在,如果我知道在第二步会花一些时间,我能否在这里放弃CPU的使用,去处理其他进来的请求,然后等到第二步完成后再回来处理这个请求?如果可以的话,我该怎么做,涉及到哪些框架?我现在使用的是Python和Flask。

3 个回答

1

看看Klein吧——它是Flask和Twisted的结合体。Twisted是一个异步反应器模式的框架,它的工作方式比你在Flask中习惯的要底层一些。

Klein就像是一个在Twisted上面的包装,使用起来和Flask非常相似——它让你可以用反应器来编写延迟执行的代码。

https://github.com/twisted/klein

1

如果你使用的是最近的 Python 版本(3.2 及以上),你可以使用 concurrent.futures 这个库。使用起来大概是这样的:

from concurrent.futures import ThreadPoolExecutor

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

Flask可以在启动时使用多个线程或进程来运行,具体可以参考这个问题。这样做并不会让foo()变得更高效,但你可以同时为多个用户提供服务。

如果你想用多个线程或进程来运行Flask,可以在Flask.run()的参数中指定:

如果是使用线程:

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

如果是使用进程:

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

撰写回答