芹菜没有与Flask一起使用

2024-04-26 22:28:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我在烧瓶应用程序中使用的是芹菜,但是芹菜(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

^{pr2}$

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

我还用flower监控任务我可以看到一个工人在运行,但我看不到任何任务是空的。知道我遗漏了什么或做错了什么吗。。 谢谢


Tags: frompyimportselfappurlsessionsite
1条回答
网友
1楼 · 发布于 2024-04-26 22:28:58

问题是,在运行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。方法任务与函数任务不同,因为它们与对象的实例相关联。换句话说,函数是一个类函数。因此,要使用以前的注册任务样式,首先需要类的实例。为了解决这个问题,你应该考虑让你的任务成为函数而不是方法。在

相关问题 更多 >