python-3.x - Flask 的异步调用方法
问题描述
我正在尝试通过 Flask 方法调用阻塞函数,但它需要几秒钟,所以我想我可以做一些异步调用来加快速度,但它没有按预期工作。显然使用 asyncio 我不能只在后台启动协程而不等待执行结束,也许我需要使用线程?或者使用 grequest 因为我的阻塞功能正在使用请求...
到目前为止,这是我的代码:
@app.route("/ressource", methods=["GET"])
def get_ressource():
do_stuff()
return make_response("OK",200)
def do_stuff():
# Some stuff
fetch_ressource()
async def fetch_ressource():
return await blocking_function()
def blocking_function():
# Take 2-3 seconds
result = request.get('path/to/remote/ressource')
put_in_database(result)
我听说过 Celeri,但它似乎只对一个功能有点矫枉过正。
解决方案
回答有点晚了,但我对此很感兴趣。
我通过包装函数并通过调用它来管理它asyncio.run()
,但我不知道多次asyncio.run()
调用是否是一件好事。
from functools import wraps
from flask import Flask
import asyncio
def async_action(f):
@wraps(f)
def wrapped(*args, **kwargs):
return asyncio.run(f(*args, **kwargs))
return wrapped
app = Flask(__name__)
@app.route('/')
@async_action
async def index():
await asyncio.sleep(2)
return 'Hello world !'
app.run()
推荐阅读
- javascript - 如何根据子组件复选框值设置父组件状态?
- reactjs - 自 v2.0.0 以来,如何将 props 传递给 React Leaflet.markercluster 选项?
- javascript - 如何中止 readline 界面问题?
- cloud - 尝试在 GNS3 中为云选择服务器时出错
- php - 用于获得个人同意的 DocuSign 重定向 URI
- javascript - 如何与 electronjs 同步数据库
- python - TypeError:无法使用 dtyped [float64] 数组和 [bool] 类型的标量执行“ror_”
- performance - 动态导入页面中的所有组件是否有任何负面影响?
- ios - EXC_BAD_ACCESS NSLog(@"错误解码 JSON 数据:%@", error.localizedDescription); 在 OpenWeather API 上
- android - Android Paging 3 我们如何在后台同步数据?