【问题标题】:Celery beat with method tasks not working芹菜节拍与方法任务不起作用
【发布时间】:2013-01-25 04:13:19
【问题描述】:

我正在尝试在方法任务上运行 celerybeat,但无法正常运行。这是一个示例设置:

from celery.contrib.methods import task_method
from celery import Celery, current_app

celery=celery('tasks', broker='amqp://guest@localhost//')
celery.config_from_object("celeryconfig")
class X(object):
    @celery.task(filter=task_method, name="X.ppp")
    def ppp(self):
        print "ppp"

我的 celeryconfig.py 文件是

from datetime import timedelta
CELERYBEAT_SCHEDULE = {
      'test' : {
               'task' : 'X.ppp', 
               'schedule' : timedelta(seconds=5)
               }, 
 }

当我运行 celery beat 时,我收到如下错误:

 task X.ppp raised exception, TypeError('ppp() takes exactly 1 argument, (0 given)  

当我把这个方法变成一个普通的函数并用`@celery.task'装饰它时,它确实有效,所以其余的设置似乎正在工作。我看到警告in the docs about method tasks,但无法真正找出问题所在。有谁知道如何解决这个问题?

【问题讨论】:

  • 嗨,您是否设法使用类方法而不是使用 python 模块中的函数来解决它?我也有同样的情况,但我的应用程序在类中大量实现,所以我现在无法使其正常运行..你能帮忙吗?
  • 当时我从未找到答案,但我也没有一直在寻找答案。如果您找到好的解决方案,请告诉我。

标签: python celery celerybeat


【解决方案1】:

问题是 Celerybeat 在调用方法之前不会实例化 X。如果方法未绑定到对象,task_method 过滤器默认调用未绑定方法。

我的问题是,你想在这里完成什么? X 没有状态,为什么不使用模块级函数呢?

【讨论】:

  • 这只是一个例子,它再现了我正在做的真实对象/任务的相同效果。有没有办法用 celerybeat 做到这一点?
  • 可能有。但我仍然不清楚你想做什么。你有一个你想让 Celerybeat 调用任务的类的实例吗?如果是这样,Celerybeat 如何知道您要针对哪个实例调用任务?
  • 不,没有对象被实例化。只是 tasks.py 中的类
  • 那么 Celery(通过 Celerybeat)没有对象可以调用任务。
  • 也许吧。虽然它可以帮助你准确理解发生了什么:'filter_method' 将任务方法包装在一个描述符中——当 Celery 访问任务时,它会将任务绑定到它被调用的实例,如果没有实例存在,它会执行任务未绑定
猜你喜欢
  • 2012-03-27
  • 2018-04-05
  • 2015-05-11
  • 2016-04-24
  • 2021-02-07
  • 2017-01-16
  • 1970-01-01
  • 2015-12-16
  • 1970-01-01
相关资源
最近更新 更多