【问题标题】:Celery @task doesn't work with instance methodsCelery @task 不适用于实例方法
【发布时间】:2013-06-19 05:09:50
【问题描述】:

我有一个用芹菜装饰的方法 @task 像这样的类:

class Port(object): 

    """docstring for Port"""


    def __init__(self,):
        print 'Class has been initialized ...'


    @celery.task(filter=task_method,name="Port.process")    
    def process(self,):
        print "I'm inside the process task method: " 

在这里调用:

p = Port()

p.process.apply_async()

我也试过:p.process.delay(),结果相同。

当我运行它时,我得到了这个错误:

[2013-06-22 02:32:53,988: ERROR/MainProcess] Task Port.process[77cff07e-4bc5-4e36-9c4e-b68d7616c74e] raised exception: TypeError('process() takes at least 1 argument (0 given)',) Traceback (most recent call last): File "/usr/local/lib/python2.7/site-packages/celery/task/trace.py", line 228, in trace_task R = retval = fun(*args, **kwargs) File "/usr/local/lib/python2.7/site-packages/celery/task/trace.py", line 415, in __protected_call__ return self.run(*args, **kwargs) TypeError: process() takes at least 1 argument (0 given)

这是重要的部分,TypeError: process() takes at least 1 argument (0 given)

现在我该如何解决这个问题??

有些人说这是因为 celery 使用了未绑定到初始化对象的方法 task,而有些人说它只是工作,我在这里错过了什么吗?

【问题讨论】:

  • 如果“类方法”是指普通的实例方法(正如您的示例所暗示的那样),这可能是 using class methods as celery tasks 的副本。如果您已经知道这一点,但您实际上在这里谈论的是@classmethods,请澄清并给出一个适当的例子。
  • 关于你的问题......是的,我的意思是实例方法。关于您提供的链接,我已经关注了它,现在我收到上述错误...
  • 这能回答你的问题吗? using class methods as celery tasks

标签: python django celery django-celery


【解决方案1】:

Celery 自 3.0 版起实验性地支持将方法用作任务。

这方面的文档在 celery.contrib.methods 中,还提到了一些您应该注意的警告:

http://docs.celeryproject.org/en/latest/reference/celery.contrib.methods.html

使用this作为参考

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-26
  • 1970-01-01
  • 1970-01-01
  • 2014-06-14
  • 1970-01-01
  • 2013-02-14
  • 2017-05-23
相关资源
最近更新 更多