Python 新型芹菜api的问题

Python 新型芹菜api的问题,python,celery,Python,Celery,我有一个类扩展了celerys任务。它在使用旧式API时运行良好,但在将其转换为新API时遇到问题 # In app/tasks.py from celery import Celery, Task celery = Celery() @celery.task class CustomTask(Task): def run(self, x): try: # do something except Exception, e:

我有一个类扩展了celerys
任务
。它在使用旧式API时运行良好,但在将其转换为新API时遇到问题

# In app/tasks.py
from celery import Celery, Task

celery = Celery()

@celery.task
class CustomTask(Task):

    def run(self, x):
        try:
            # do something
        except Exception, e:
            self.retry(args=[x], exc=e)
然后我像这样运行任务-

CustomTask().apply_async(args=[x], queue='q1')
我得到了错误-

TypeError: run() takes exactly 2 arguments (1 given)
似乎做了同样的事情,它被接受了,所以它大概是有效的。有人能帮我解释一下为什么我的代码不起作用吗

编辑

如果我给任务命名,而不是给类名命名,这是可行的-

name = 'app.tasks.CustomTask2'
但是如果我保持任务的名称与完整的类名相同,它就不起作用了

name = 'app.tasks.CustomTask'

但是使用不同名称的问题是芹菜有一个额外的任务,与任务类名同名。

装饰器不用于类,而是用于函数

通常,除非您想要实现公共行为,否则您不想定义自定义任务类

因此,要么删除
@芹菜.task
装饰器,要么将其与函数一起使用

请注意,此处定义的任务不与任何芹菜实例绑定

注意绑定到任何特定应用程序实例:

from celery import Task

class MyTask(Task):
    pass
您可以稍后进行绑定:

from celery import Celery
app = Celery(broker='amqp://')

MyTask.bind(app)
或者,您可以使用应用程序上提供的基类:

from celery import Celery
app = Celery(broker='amqp://')

class MyTask(app.Task):
    pass
最后一个示例不是很清晰,因为它意味着您正在模块级完成应用程序,
这就是为什么将任务装饰器与函数一起使用是最佳实践的另一个原因,它只创建自定义类作为装饰任务的基类(
@task(base=MyTask)
)。

为什么需要
芹菜=芹菜()
?嗯,没关系,它在文档中,尽管它不起作用。使用函数,它们是这样工作的,我没有。当我发布这篇文章时,我正在尝试这篇文章,希望它能起作用。我在没有
celery=celery()
的情况下尝试过它,但仍然会出现相同的错误。那就是使用
import celery
@celery.task
celery.task
Hm,您的示例应该与
CustomTask.apply\u async(…)
一起使用。我在这方面的实验。这是一种奇怪的行为,我只是假设使用这样的类不是正确的方法,也就是说,您应该将函数与自定义基类一起使用。奇怪的是,当我在task类和
routers.py
中更改任务名称时,它起了作用。但当我开始吃芹菜时,老任务仍然出现了。