通过Flask应用程序运行celery apply_async出现的问题

时间:2020-11-01 18:07:51

标签: python flask celery

这是我的第一个烧瓶和芹菜项目。我的Flask应用程序具有一个运行时间较长的进程,因此我尝试使用Celery使其异步运行。 基本上,代码需要根据请求生成文件。 完成后,应将用户重定向到可以下载此文件的页面。 作为AMQP,我使用Rabbitmq。 我的项目具有以下结构:

Project/
|-- flasK.py
|-- asynC.py
|--db.sqlite3    
|
|-- templates/
|   |-- index.html
|   |-- done.html
|   |-- inProc.html
|
|-- |-- static/
    |-- css(empty)
    |-- js(empty)

运行烧瓶服务器flasK.py的脚本:

from asy import createSAV_2
from flask import Flask, render_template, url_for, request, redirect, send_file, send_from_directory, safe_join, abort
from celery.result import AsyncResult

flask_app = Flask(__name__)

@flask_app.route('/', methods=['POST', 'GET'])
def index():
    if request.method == 'POST':
        #createSAV_2.apply_async((2, 2), queue='test')
        createSAV_2.delay(2, 2)

        return render_template("inProc.html")
    else:
        pass
    return render_template("index.html")


if __name__ == '__main__':
    flask_app.run(port=8080, debug=True)

运行Celery,asynC.py的代码:

from celery import Celery
from time import sleep
from celery.result import AsyncResult
from flask import render_template

app = Celery('asy', broker='pyamqp://guest@localhost//', backend='db+sqlite:///db.sqlite3')

@app.task(name='createSAV_2')
def createSAV_2 (a, b):
    sleep(5)
    return render_template("done.html")

我运行服务器并尝试模拟数据请求后,出现此错误:

[2020-11-01 13:44:41,545: ERROR/ForkPoolWorker-2] Task createSAV_2[93a094c7-2315-4016-8deb-acffae18f0ef] raised unexpected: AttributeError("'NoneType' object has no attribute 'app'")
    Traceback (most recent call last):
      File "/Users/bbk/Desktop/labelingTool_v1/tool_v0/venv/lib/python3.7/site-packages/celery/app/trace.py", line 409, in trace_task
        R = retval = fun(*args, **kwargs)
      File "/Users/bbk/Desktop/labelingTool_v1/tool_v0/venv/lib/python3.7/site-packages/celery/app/trace.py", line 701, in __protected_call__
        return self.run(*args, **kwargs)
      File "/Users/bbk/Desktop/labelingTool_v1/tool_v0/asy.py", line 11, in createSAV_2
        return render_template("done.html")
      File "/Users/bbk/Desktop/labelingTool_v1/tool_v0/venv/lib/python3.7/site-packages/flask/templating.py", line 136, in render_template
        ctx.app.update_template_context(context)
    AttributeError: 'NoneType' object has no attribute 'app' 

如果我使用.apply_async而不是.delay,则不会收到任何错误或其他消息。

Celery正在运行,如果我试图从docs运行示例代码: https://docs.celeryproject.org/en/stable/getting-started/first-steps-with-celery.html 然后就可以了。

如果您有任何想法/建议,请告诉我

1 个答案:

答案 0 :(得分:0)

您不应将Celery用于此用途,Celery用于在另一台服务器或实例上运行异步任务。

要解决您的错误,请不要在asy.py中使用任何Flask导入并继续使用.delay(),但是在这种情况下,芹菜是无用的,因为您只能调用createSAV_2()方法。

如果您真的想这样做,因为createSAV_2()可能需要一段时间,则应该使用apply_async()生成一个任务,并实现一个循环以等待任务结束。因此,与使用delay() ...

几乎相同

总而言之,我不确定Celery在您的特定情况下是否有用。一开始要保持简单。

(评论已转换为答案)

相关问题