2014-11-19 1 views
2

매개 변수의 값에 따라 비동기 쿼리를 실행하거나 실행하지 싶습니다. 매개 변수가 True이면 쿼리가 실행되지 않아야합니다.@ tornado.gen.engine 함수에서 수익률없이 반환 하시겠습니까?

@tornado.gen.engine 
def retrieveSomeData(self, feelingLucky, callback): 
    if feelingLucky: 
     return  # <-- doesn't work, function never returns! 
    else: 
     response = yield tornado.gen.Task(queryFunction, param1....) 
     callback(response) 

가 어떻게이 feelingLucky 가지 작업을 할 수 있습니다 :

는이 같은 방법이 있나요?

내가 생각할 수있는 유일한 예외는 예외를 발생시키고 호출자에게 잡는 것입니다. 그러나 그것은 매우 추악합니다.

def _nullTask(self, callback): 
    callback() 

@tornado.gen.engine 
def retrieveSomeData(self, feelingLucky, callback): 
    if feelingLucky: 
     yield tornado.gen.Task(self._nullTask) 
     callback(None) 
    else: 
     response = yield tornado.gen.Task(queryFunction, param1....) 
     callback(response) 

는 아마도 더 좋은 방법이하십시오 널 (null) 작업 같은 것이 ...이 있다면 또는

(파이썬 2.7, 토네이도 3.2)

답변

5

더 나은 대신 오래된 gen.engine의 현대 gen.coroutine를 사용합니다. 당신이 queryFunction이 너무 스타일을 코 루틴을 변환하면

@tornado.gen.coroutine 
def retrieveSomeData(self, feelingLucky): 
    if feelingLucky: 
     return 
    else: 
     response = yield Tornado.gen.Task(queryFunction, param1....) 
     raise gen.Return(response) 

, 당신이 얻을 : 그것은 간단하고 자연 조건 논리의 이런 종류가 있습니다

@tornado.gen.coroutine 
def retrieveSomeData(self, feelingLucky): 
    if feelingLucky: 
     return 
    else: 
     response = yield queryFunction(param1....) 
     raise gen.Return(response) 
+0

감사합니다, 나는 당신이 코 루틴 및 엔진/작업을 혼합 할 수 있습니다 몰랐다 . 'return'은 여전히 ​​작동하지 않지만, 이제 항복하지 않는 가지에서'gen.Return (raise)'을 할 수 있습니다. – egbokul

+0

인수가없는 "return"은 "raise gen.Return()"과 같습니다. 파이썬 2와 파이썬 3에서는 약간의 혼동이있을 수 있습니다 : 파이썬 2에서는 생성자가 값을 반환 할 수 없지만 파이썬 2와 3에서는 맨손으로 "리턴"이 동일하게 작동합니다. 작동하지 않습니까? " –

+0

잘 모르겠습니다 - 실행해야하는 곳에서 실행을 다시 시작하지 않으며 함수/생성기가 절대로 종료되지 않습니다 (호출 코드로 반환되지 않음). 내가 볼 수있는 것은 gen.py를 통한 반복 실행이므로 디버그하기가 어렵습니다. – egbokul

1

이 작동하는 것 같다 ? ...

(gen.py이 의견을 바탕으로 :

callback 키워드 인수를 취하는 어떤 기능을 Futures, Task 작품을 반환하지 않는 기능을합니다.)에 대한

관련 문제