这是我第一个使用烧瓶和芹菜的项目。我的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正在运行,如果我试图从文档中运行示例代码:https://docs.celeryproject.org/en/stable/getting-started/first-steps-with-celery.html那么它工作得很好。
如果你有任何想法/建议,请告诉我
您不应该使用Celery进行此用途,Celery用于在另一台服务器或实例上运行异步任务。
要修复您的错误,请不要在asy.py中使用任何Flask导入,并继续使用.delay()
,但在这种情况下,芹菜是无用的,因为您可以只调用createSAV_2()
方法。
如果您真的想这样做,因为createSAV_2()
可能需要一段时间,那么您应该用apply_async()
生成一个任务,并实现一个循环来等待任务结束。所以它几乎与使用delay()
相同。。。
总之,我不确定芹菜在你的具体情况下是否有用。一开始就保持简单。
(注释转换为答案(