2014-05-24 5 views
3

나는 토네이도 웹 프레임 워크를 사용하고 있습니다. 샐러리 태스크가클래스의 객체를 @ gen.coroutine 데코 레이팅 된 핸들러에서 사용하기 위해 반환 할 수 있습니까? 내가 뭘하려고 오전셀러리가 미래를 되찾게 만들기

는 다음과 같습니다 : 나는 tornado-celery을 본 적이

class TornadoRequestHandler(BaseHandler): 

     @gen.coroutine 
     def get(self): 
       result = yield celery_task.apply_aync() 
       self.write(result) 
       self.finish() 

하지만 내가 달성하기 위해 노력하고 정확히하지 않습니다.

답변

3

지금까지 내가 아는 한,이 작업을 수행 할 수있는 유일한 방법은 당신이 할 수 있도록 할, 토네이도 셀러리 경유 :

class TornadoRequestHandler(BaseHandler): 

    @gen.coroutine 
    def get(self): 
      result = yield gen.Task(celery_task.apply_aync) 
      self.write(result) 
      self.finish() 

이유는 gen.coroutine를 사용할 때 당신이 원하는 행동이 모든에 의존하고 있는지를 메서드가 완료 될 때 호출되는 callback kwarg를 호출하는 비동기 메서드. celery_task.apply_asynccallback kwarg를 사용하지 않으므로 gen.coroutine을 직접 사용할 수 없습니다. apply_async**options 매개 변수를 사용한다는 사실을 악용하여 임의의 kwargs가 될 수 있음은 tornado-celery처럼 보입니다. 즉, apply_async은 실제로 callback kwarg을 수락하지만 무시됩니다. tornado-celery은 게시 작업을 담당하는 Celery 클래스를 재정 의하여이 기능을 활용하고 게시 프로세스를 변경하여 작업을 게시 한 다음 작업이 완료 될 때 게시되는 결과 큐에서 소모합니다. 소비 코드는 일반적으로 무시되는 callback kwarg에 의해 제공되는 함수를 실행합니다.이 함수는 **options을 추출합니다.

그 설명이 얼마나 명확한 지 모르지만, tl, dr 버전은 토네이도입니다. 셀러리는 원하는 동작에 최대한 가까이 접근 할 수있는 가장 간단한 방법을 제공합니다.

+0

안녕하세요! 답변 주셔서 감사합니다. 나는 그렇게 생각한다. :) 토네이도 - 셀러리는 훌륭한 라이브러리이지만, 이제는 작업이 끝날 때까지 기다리는 호출자 함수를 사용하여 실행 프로그램에서 샐러리 작업을 실행하여 해결했다. 그것은 약간의 코드이고 그것은 토네이도 표준 도구와 wokrs. – eatdas

+0

'gen'과 셀러리의'apply_async'에 대한 결과 개념은 상당히 다르다. 하나는 ioloop에서, 또 하나는 태스크 큐에서 미래 다. 나중에 하나는 result.get()이고, 이전 것은'yield'입니다. 그러나, 토네이도 - 샐러리는 전부 그들을 섞었다. –

관련 문제