我正在尝试使用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。
答案 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代码。