芹菜任务
问题描述:
我有看起来像这样的芹菜任务
from mybasetask_module import MyBaseTask
@task(base=MyBaseTask)
@my_custom_decorator
def my_task(*args, **kwargs):
pass
一个任务,我的基本任务是这样的
from celery import task, Task
class MyBaseTask(Task):
abstract = True
default_retry_delay = 10
max_retries = 3
acks_late = True
我跑的问题进入的是,芹菜工人正在注册任务名称
'mybasetask_module.__inner'
该任务注册罚款(whi CH是当我从任务删除@my_custom_decorator或者如果我提供一个明确的名称,任务这样
from mybasetask_module import MyBaseTask
@task(base=MyBaseTask, name='an_explicit_task_name')
@my_custom_decorator
def my_task(*args, **kwargs):
pass
这种行为预期包+模块+功能)?当我有多个装饰器但没有明确的任务名称时,是否需要执行某些操作以使我的任务在第一种情况下使用默认的自动注册名称进行注册?
感谢,
答
使用functools.wraps()
decorator以确保由my_custom_decorator
返回的包装具有正确的名称:
from functools import wraps
def my_custom_decorator(func):
@wraps(func)
def __inner():
return func()
return __inner
任务名称从函数调用采取的task
装饰包裹,而是由插入装饰器之间,你给task
你的__inner
包装功能。 functools.wraps()
修饰器将所有必要的元数据从func
复制到包装器,以便task()
可以选择正确的名称。
这就是现货!现在工作。感谢您添加解释以及:)。现在对我有意义。 – ksrini