PythonFlask异步问题

2024-06-25 05:44:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个web端点供用户上传文件。 当端点接收到请求时,我希望运行后台作业来处理该文件。在

由于完成作业需要时间,因此我希望将作业id返回给用户,以便在作业在后台运行时跟踪请求的状态。在

我想知道asyncio在这种情况下是否有帮助。在

import asyncio

@asyncio.coroutine
def process_file(job_id, file_obj):
     <process the file and dump results in db>

@app.route('/file-upload', methods=['POST'])
def upload_file():
    job_id = uuid()
    process_file(job_id, requests.files['file']) . # I want this call to be asyc without any await
    return jsonify('message' : 'Request received. Track the status using: " + `job_id`)

使用上述代码,永远不会调用process_file方法。不明白为什么。在

我不确定这是不是正确的方法,但请帮助,如果我错过了什么。在


Tags: 文件the方法用户webasyncioiddef
2条回答

由于@py_dudementionedFlask不支持异步调用。如果您正在寻找一个功能和感觉类似于Flask但是异步的库,我建议您签出^{}。下面是一些示例代码:

from sanic import Sanic
from sanic.response import json

app = Sanic()

@app.route("/")
async def test(request):
    return json({"hello": "world"})

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8000)

异步更新数据库应该不是问题;请参阅here以查找支持异步的数据库驱动程序。要处理文件,请签出^{}。如果异步运行,您可以在单个线程上非常快速地运行服务器,而不会出现任何问题。在

Flask还不支持异步调用。在

要在后台创建和执行繁重的任务,可以使用https://flask.palletsprojects.com/en/1.1.x/patterns/celery/芹菜库。在

你可以参考一下: Making an asynchronous task in Flask

官方文件: http://docs.celeryproject.org/en/latest/getting-started/first-steps-with-celery.html#installing-celery

即使您在函数周围写了@asyncio.coroutine(),但它绝不是通知函数返回结果的awaited。在

Asyncio不适合这类任务,因为它们阻塞了I/O。它通常用于进行函数调用和快速返回结果。在

相关问题 更多 >