芹菜不与烧瓶一起使用



我在烧瓶应用程序中使用芹菜,但使用芹菜(3.1.8)。这是我使用烧瓶应用程序的配置

芹菜.py

from __future__ import absolute_import
from celery import Celery
from cuewords.settings import CELERY_BROKER_URL,CELERY_RESULT_BACKEND
app = Celery('proj',
broker=CELERY_BROKER_URL,
backend=CELERY_RESULT_BACKEND)
app.conf.update(CELERY_TASK_RESULT_EXPIRES=3600)
if __name__ == '__main__':
app.start()

设置.py

CELERY_BROKER_URL='redis://localhost:6379/0'
CELERY_RESULT_BACKEND='redis://localhost:6379/0'
BROKER_TRANSPORT = 'redis'

api.py

class Webcontent(Resource):
def post(self,session=session):
args = self.parser.parse_args()
site_url = args["url"]
url_present=Websitecontent.site_url_present(session,site_url)
if site_url.strip() != "" and not url_present:
try:
#add data and commit 
session.commit()
websitecontent=Websitecontent(params*)
websitecontent.update_url(id,session)
except:
session.rollback()
raise
finally:
session.close()                
else:
return "No data created / data already present"

在我的模型中,我正在为任务添加一种方法

模型.py

from cuewords.celery import app
class Websitecontent(Base):
@app.task(name='update_url')
def update_url(self,id,session):
...code goes here..

这就是我如何从命令提示符运行芹菜

celery -A cuewords.celery worker

我也用花来监控任务,我可以看到一个工人在运行,但我看不到任何任务是空的。我知道我错过了什么或做错了什么。。感谢

问题是,在运行工作程序时,您的任务永远不会导入到Python运行时。celery命令是您的入口点。您告诉Celery导入您的cuewords.celery模块,因为您的应用程序实例所在的位置。然而,这是事件链的终点,并且不会导入更多的Python代码。

现在,最常见的错误是将任务导入到与Celery应用程序实例相同的模块中。不幸的是,这将导致两个模块试图从彼此导入内容,并导致循环导入错误。这不好。

为了解决这个问题,可以将任务函数导入到Celery应用程序模块中,并在不使用decorator样式的情况下注册它们。例如:

from celery import Celery
from models import my_task
app = Celery()
app.task(name='my_task')(my_task)

这将消除在模型模块中导入应用程序实例的需要。

但是,您使用的是方法任务。方法任务需要与函数任务区别对待,如下所述:http://docs.celeryproject.org/en/latest/reference/celery.contrib.methods.html.方法任务不同于函数任务,因为它们与对象的实例相关联。换句话说,该函数是一个类函数。因此,要使用以前的注册任务样式,首先需要一个类的实例。为了解决这个问题,你应该考虑让你的任务变成函数,而不是方法。

相关内容

  • 没有找到相关文章

最新更新