【问题标题】:Python Flask - Asyncio asynchronous QuestionPython Flask - Asyncio 异步问题
【发布时间】:2019-11-22 14:53:26
【问题描述】:

我有一个网络端点供用户上传文件。 当端点收到请求时,我想运行一个后台作业来处理文件。

由于作业需要时间来完成,我希望将作业 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 方法永远不会被调用。无法理解为什么。

我不确定这是否是正确的方法,如果我遗漏了什么,请帮忙。

【问题讨论】:

    标签: python flask python-multithreading aiohttp python-asyncio


    【解决方案1】:

    Flask 还不支持异步调用。

    要在后台创建和执行繁重的任务,您可以使用https://flask.palletsprojects.com/en/1.1.x/patterns/celery/ 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。它通常用于进行函数调用并快速返回结果。

    【讨论】:

      【解决方案2】:

      作为@py_dudementionedFlask 不支持异步调用。如果您正在寻找功能和感觉类似于Flask 但异步的库,我建议您查看Sanic。下面是一些示例代码:

      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 以查找支持异步的数据库驱动程序。如需处理您的文件,请查看aiohttp。如果您异步执行此操作,您可以在单个线程上非常快速地运行您的服务器,而不会出现任何问题。

      【讨论】:

      • Sanic 不会为你处理后台任务
      • @py_dude 什么?不,不——Sanic 只允许 任何其他 进程与服务器异步运行。如果他打算只对文件进行小处理并更新数据库Sanic 将是一个很好的工具。
      • 这就是重点,他不会只写数据库。他要计算一些非常重的东西
      • 我为你更新了我的答案,并添加了aiofiles。只是提供选择。
      • 为了进一步澄清,OP 没有提到他会计算一些繁重的东西。不确定为什么没有批评而投反对票。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-02
      • 2015-12-02
      • 1970-01-01
      相关资源
      最近更新 更多