2012-11-21 38 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