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

처럼 실행하고있어 문제가 보인다 으로는 셀러리 작업자가 작업 등록을 한 미세 (WHI는

'mybasetask_module.__inner' 

이름으로 작업을 등록하는 것입니다 CH 내가이

from mybasetask_module import MyBaseTask 

@task(base=MyBaseTask, name='an_explicit_task_name') 
@my_custom_decorator 
def my_task(*args, **kwargs): 
    pass 

같은 작업에 명시 적 이름을 제공 할 경우이 문제가 예상되어 내가 작업에서 @my_custom_decorator을 제거하거나 패키지 + 모듈 + 기능)인가? 장식자를 여러 개 가지고 있지만 작업 이름을 명시하지 않은 경우 첫 번째 경우에 내 작업이 기본 자동 등록 된 이름으로 등록되도록해야합니까?

감사합니다,

답변

22

사용 functools.wraps() decoratormy_custom_decorator에 의해 반환 된 래퍼가 올바른 이름이 있는지 확인합니다 : 작업 이름은 함수 호출에서 가져

from functools import wraps 

def my_custom_decorator(func): 
    @wraps(func) 
    def __inner(): 
     return func() 
    return __inner 

task 장식 랩,하지만하여 그 그 사이에 장식자를 삽입하면 task__inner 포장 기능을 대신 제공했습니다. functools.wraps() 데코레이터는 에서 필요한 모든 메타 데이터를 래퍼로 복사하여 task()이 올바른 이름을 선택할 수 있도록합니다.

+2

그 자리에있었습니다! 이제 작동합니다. 설명을 추가해 주셔서 감사합니다 :). 지금 나에게 의미가있다. – ksrini