2013-08-07 2 views
2

플라스크 웹 앱이 있고 장시간 실행되는 일부 작업 (> 1 분)이 있습니다. 플라스크 (웹 서버 차단 등)에서 이것을 꺼내 외부 작업으로 옮기고 싶습니다. 셀러리 설정이있어서 플라스크에서 이러한 작업을 실행할 수 있습니다. 좋은.셀러리 + RabbitMQ 결과 백엔드 + 웹 소켓?

작업이 완료되었을 때 사용자에게 알리고 결과를 반환하려면 웹 소켓을 사용하고 싶습니다. 이것은 어려운 곳입니다.

내 클라이언트가 연결되어있는 실행 가능한 websocket 서버가 있습니다. 셀러리 작업을 시작할 때 클라이언트의 세션 ID를 전달하므로 결과가 나올 때 누가 속해 있는지 알 수 있습니다.

이제 이러한 작업이 완료된 시점을 확인하고 결과를보고 적절한 연결로 보내려면 websocket 서버가 필요합니다.

어떻게? 이것은 내가 완전히 잃어버린 곳입니다. celery.events.EventListener.capture으로 샐러리 이벤트를들을 수 있지만 여러 개의 연결을 가질 수 없기 때문에이 웹 서버를 차단합니다!

차단하지 않고 셀리 이벤트를 수신 대기하려면 어떻게해야합니까?

하나의 아이디어는 웹 소켓을 통해 요청한 다음 웹 소켓 서버에서 셀러리 작업을 시작하는 것입니다. 그건 알림 문제 (그냥 셀러리 이벤트 사용) 해결할 것입니다,하지만 난 아직도 내 표준 플라스크 서버에 요청한 내 원래 질문에 대한 호기심이야.

답변

1

캡처 호출을 차단하지 않으려면 플라스크 앱이 필요합니다. 한 가지 해결책은 gevent 또는 eventlet이있는 플라스크를 실행하여 프로세스가 요청을 비동기 적으로 처리하고 호출을 차단하더라도 프로세스가 차단되지 않도록하는 것입니다.

하나의 이름을 지정하기 위해 많은 예제가 있습니다. https://gist.github.com/lrvick/1185629

관련 문제