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,但它似乎只有一个功能有点矫枉过正。

原文由 Raphael Todo 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 793
1 个回答

回答有点晚了,但我对此很感兴趣。

我通过包装函数并通过 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()

原文由 luc.chante 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进