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())