2017-12-05 6 views
1

파이썬 데코레이터에 약간의 문제가 있습니다. 어떤 이유Python 사용자 정의 데코레이터가 셀러 작업과 작동하지 않습니다.

def decorated(func): 
    def call_and_update(*args, **kwargs): 
     # do some stuff here 
     output = func(*args, **kwargs) 
     # do more stuff here 
     return output 
    return call_and_update 

@celery.task 
@decorated 
def testA(): 
    return "Test A" 

@celery.task 
@decorated 
def testB(): 
    return "Test B" 

, 내가 먼저 장식의 func으로 지속 될 것으로 보인다 전화 중 기능 : 나는과 같이 설정 시나리오를 가지고있다.

>>> testA() 
Test A 
>>> testB() 
Test A 

를하거나, 내가 쉘을 다시 시작하면 두 번째 테스트 시작 :

그래서 예를 들어, 내가 쉘을 시작하면 실행 내가 this question with a similar issue을 발견

>>> testB() 
Test B 
>>>> testA() 
Test B 

하지만, 몇 가지 답변은 대신 작업 메서드에 대한 확장 클래스를 사용하여 돌아갔습니다.

데코레이터 및 함수를 통해이 작업을 구체적으로 수행하려는 경우 작동 시키려면 트릭이 있습니까?

데코레이터가없는@celery.task이 없으면 기능은 정상적으로 작동합니다. 특히 문제를 일으키는 두 개의 데코레이터의 조합입니다.

감사합니다.

+0

셀러 리 작업 장식을 사용하는 경우에만이 동작이 표시됩니까? –

+0

@ juanpa.arrivillaga correct. celery.task 데코레이터가 없으면 함수는 정상적으로 작동합니다. (이 질문에 유의하겠습니다) – CaptainPlanet

+0

이것은 복제본입니다. TLDR : 셀러리 태스크가 올바른 함수 이름을 기록 할 수 있도록'functools.wraps()'를 사용하십시오 (그렇지 않으면 모든 태스크의 이름은'call_and_update'입니다). –

답변

1

래퍼 기능의 이름을 사용하고 있지 않으므로 각 작업마다 고유 한 이름 celery docs이 필요합니다.

@celery.task(name='test-A') 
@decorated 
def testA(): 
    return 'test A' 

@celery.task(name='test-B') 
@decorated 
def testB(): 
    return 'test B' 
+0

그래, 그랬어! 이걸 잊어 버리 셨습니다. 자연스럽게 함수 이름을 기본값으로 사용하는 것처럼 보이지만, 함수가 여분의'@ decorated' 데코레이터로 둘러싸 일 때, 데코레이터 함수 이름 대신 기본값으로 사용됩니다. 감사! – CaptainPlanet

+1

@CaptainPlanet :''fun'' 함수 내에서 ['functools.wraps'] (https://docs.python.org/3/library/functools.html#functools.wraps)를 사용할 수도 있습니다. 이렇게하면 이름을 업데이트하여 데코레이션 된 기능을 원본과 같이 "룩"하게 만듭니다. – Blender

관련 문제