2012-11-21 220 views
9

我有看起来像这样的芹菜任务

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 

这种行为预期包+模块+功能)?当我有多个装饰器但没有明确的任务名称时,是否需要执行某些操作以使我的任务在第一种情况下使用默认的自动注册名称进行注册?

感谢,

回答

22

使用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()可以选择正确的名称。

+2

这就是现货!现在工作。感谢您添加解释以及:)。现在对我有意义。 – ksrini