지금까지 내가 아는 한,이 작업을 수행 할 수있는 유일한 방법은 당신이 할 수 있도록 할, 토네이도 셀러리 경유 :
이
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_async
은 callback
kwarg를 사용하지 않으므로 gen.coroutine
을 직접 사용할 수 없습니다. apply_async
이 **options
매개 변수를 사용한다는 사실을 악용하여 임의의 kwargs가 될 수 있음은 tornado-celery
처럼 보입니다. 즉, apply_async
은 실제로 callback
kwarg을 수락하지만 무시됩니다. tornado-celery
은 게시 작업을 담당하는 Celery 클래스를 재정 의하여이 기능을 활용하고 게시 프로세스를 변경하여 작업을 게시 한 다음 작업이 완료 될 때 게시되는 결과 큐에서 소모합니다. 소비 코드는 일반적으로 무시되는 callback
kwarg에 의해 제공되는 함수를 실행합니다.이 함수는 **options
을 추출합니다.
그 설명이 얼마나 명확한 지 모르지만, tl, dr 버전은 토네이도입니다. 셀러리는 원하는 동작에 최대한 가까이 접근 할 수있는 가장 간단한 방법을 제공합니다.
안녕하세요! 답변 주셔서 감사합니다. 나는 그렇게 생각한다. :) 토네이도 - 셀러리는 훌륭한 라이브러리이지만, 이제는 작업이 끝날 때까지 기다리는 호출자 함수를 사용하여 실행 프로그램에서 샐러리 작업을 실행하여 해결했다. 그것은 약간의 코드이고 그것은 토네이도 표준 도구와 wokrs. – eatdas
'gen'과 셀러리의'apply_async'에 대한 결과 개념은 상당히 다르다. 하나는 ioloop에서, 또 하나는 태스크 큐에서 미래 다. 나중에 하나는 result.get()이고, 이전 것은'yield'입니다. 그러나, 토네이도 - 샐러리는 전부 그들을 섞었다. –