Django 芹菜4.0.0和基于类的任务工作流

Django 芹菜4.0.0和基于类的任务工作流,django,celery,Django,Celery,根据这些例子: 我想创造一些类似的东西: class CalculationWorker(Task): def __init__(self, id_user): self._id_user = id_user self._user = get_object_or_404(User, pk=self._id_user) # I need to understand if the bind work or if it's needed

根据这些例子:

我想创造一些类似的东西:

class CalculationWorker(Task):

    def __init__(self, id_user):
        self._id_user = id_user
        self._user = get_object_or_404(User, pk=self._id_user)

    # I need to understand if the bind work or if it's needed
    def _bind(self, app):
        return super(self.__class__, self).bind(celery_app)

    def _retrieve_some_task(self):
        # long calculation

    def _long_run_task(self):
        # long calculation
        self._retrieve_some_task()

    # Main entry
    def run(self):
        self._long_run_task()


# 
def run_job():  
    worker = CalculationWorker(id_user=323232)
    task = worker.apply_async()
文档似乎说这是可能的(无论如何,我不清楚)。它甚至说:

“”“ 这意味着每个进程只调用一次init构造函数,并且任务类在语义上更接近于参与者。 “”

但是明确地说:“最佳实践是只使用自定义任务类覆盖一般行为,然后使用任务装饰器来实现任务”

因此,我得到了一个NotRegistered异常,但添加
app.tasks.register(CalculationWorker())
并没有解决它。 我使用的是Django 1.10.X和芹菜4.0.0

这种方法仍然有效吗


谢谢

我不确定这是否是最好的解决方案,但您可以使用变通方法来获得所需的行为。我正在做类似的事情,以便能够以更清晰的方式在任务上粘贴错误处理程序

从文件中

最佳实践是仅将自定义任务类用于重写 一般行为,然后使用任务装饰器来实现 任务:

但您可以将所有任务代码放在CustomTask中,只需在修饰的任务声明中留下一个存根即可。您确实需要在存根中调用任务的超类,如下所示:

@app.task(bin=True, base=CustomTask)
def custom(self, *args):
    super(type(self), self).run(*args)

然后,您将修饰函数声明视为调用芹菜的任务注册机制的一种方式。不过,我希望5.0中会出现更干净的东西。

如果您使用芹菜-4.0.1,那么您应该查看
chris 1
指出的文档

任务类不再使用在任务注册表中自动注册任务的特殊元类

现在您应该像这样注册您的任务

class CustomTask(Task):
    def run(self):
        print('running')
app.register_task(CustomTask())

我按照你展示的方式做了,你知道如何使用这个手动注册任务添加超时之类的属性吗?@Leow yep,检查芹菜中的
class Task
,你会发现如果
None
class CustomTask(Task):
    def run(self):
        print('running')
app.register_task(CustomTask())