芹菜没有与烧瓶应用一起运行

shi*_*iva 4 python celery flask python-2.7 flask-restful

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

celery.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()
Run Code Online (Sandbox Code Playgroud)

setting.py

  CELERY_BROKER_URL='redis://localhost:6379/0'
  CELERY_RESULT_BACKEND='redis://localhost:6379/0'
  BROKER_TRANSPORT = 'redis'
Run Code Online (Sandbox Code Playgroud)

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"
Run Code Online (Sandbox Code Playgroud)

在我的模型中,我正在添加一个方法来完成任务

model.py

  from cuewords.celery import app
  class Websitecontent(Base):

    @app.task(name='update_url')
    def update_url(self,id,session):
    ...code goes here..
Run Code Online (Sandbox Code Playgroud)

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

celery -A cuewords.celery worker
Run Code Online (Sandbox Code Playgroud)

而且我还使用花来监控任务,我可以看到一个工人正在运行,但我看不到任何任务它是空的.任何想法我失踪或做错了..谢谢

Mat*_*t W 7

问题是,在运行worker时,您的任务永远不会导入Python运行时.该celery命令是您的切入点.而且你告诉Celery导入你的cuewords.celery模块,因为那是你的app实例所在的地方.但是,这是事件链结束的地方,不再导入其他Python代码.

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

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

from celery import Celery
from models import my_task

app = Celery()
app.task(name='my_task')(my_task)
Run Code Online (Sandbox Code Playgroud)

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

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