Python中的异步回调函数
我正在用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非常相似——它让你可以用反应器来编写延迟执行的代码。
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.