[PYTHON] 토네이도 셀러리 통합 해킹
PYTHON토네이도 셀러리 통합 해킹
아무도이 게시물에 해결 방법을 제공 했으므로 필자가 필사적으로 해결 방법이 필요하다는 사실을 알기에 여기에 내 상황과 토론을위한 몇 가지 추상적 인 솔루션 / 아이디어가 있습니다.
내 스택 :
내 문제 : 토네이도가 샐러리 작업을 파견하고 (해결 된) 결과를 비동기식으로 모을 수있는 방법을 찾는다.
시나리오 1 : (요청 / 응답 해킹 + 웹 훅)
이것이 일어날 수 있습니까? 어떤 논리가 있습니까?
시나리오 2 : (토네이도 플러스 롱 폴링)
이것이 효율적입니까?
다른 아이디어 / 스키마?
해결법
-
==============================
1.나는이 질문에 비틀 거리며 결과 백엔드를 반복적으로 치는 것이 나에게 최적으로 보이지 않았다. 그래서 유닉스 소켓을 사용하는 시나리오 1과 비슷한 믹스 인을 구현했습니다.
나는이 질문에 비틀 거리며 결과 백엔드를 반복적으로 치는 것이 나에게 최적으로 보이지 않았다. 그래서 유닉스 소켓을 사용하는 시나리오 1과 비슷한 믹스 인을 구현했습니다.
작업이 끝나자 마자 토네이도에 알려주고 (체인의 다음 작업이 실행되는 즉시 정확함) 결과 백엔드 한 번만 치게됩니다. 여기 링크가 있습니다.
-
==============================
2.내 해결책은 토네이도에서 셀러리까지 폴링하는 것입니다.
내 해결책은 토네이도에서 셀러리까지 폴링하는 것입니다.
class CeleryHandler(tornado.web.RequestHandlerr): @tornado.web.asynchronous def get(self): task = yourCeleryTask.delay(**kwargs) def check_celery_task(): if task.ready(): self.write({'success':True} ) self.set_header("Content-Type", "application/json") self.finish() else: tornado.ioloop.IOLoop.instance().add_timeout(datetime.timedelta(0.00001), check_celery_task) tornado.ioloop.IOLoop.instance().add_timeout(datetime.timedelta(0.00001), check_celery_task)
여기 그것에 대한 게시물입니다.
-
==============================
3.문제에 대한 우리의 해결책이 여기있다. 우리가 응용 프로그램에서 여러 핸들러에서 결과를 찾았으므로 셀러리 조회에 mixin 클래스를 만들었습니다.
문제에 대한 우리의 해결책이 여기있다. 우리가 응용 프로그램에서 여러 핸들러에서 결과를 찾았으므로 셀러리 조회에 mixin 클래스를 만들었습니다.
이렇게하면 tornado.gen 패턴으로 코드를보다 쉽게 읽을 수 있습니다.
from functools import partial class CeleryResultMixin(object): """ Adds a callback function which could wait for the result asynchronously """ def wait_for_result(self, task, callback): if task.ready(): callback(task.result) else: # TODO: Is this going to be too demanding on the result backend ? # Probably there should be a timeout before each add_callback tornado.ioloop.IOLoop.instance().add_callback( partial(self.wait_for_result, task, callback) ) class ARemoteTaskHandler(CeleryResultMixin, tornado.web.RequestHandler): """Execute a task asynchronously over a celery worker. Wait for the result without blocking When the result is available send it back """ @tornado.web.asynchronous @tornado.web.authenticated @tornado.gen.engine def post(self): """Test the provided Magento connection """ task = expensive_task.delay( self.get_argument('somearg'), ) result = yield tornado.gen.Task(self.wait_for_result, task) self.write({ 'success': True, 'result': result.some_value }) self.finish()
-
==============================
4.자, https://github.com/mher/tornado-celery가 구출에 온다 ...
자, https://github.com/mher/tornado-celery가 구출에 온다 ...
class GenAsyncHandler(web.RequestHandler): @asynchronous @gen.coroutine def get(self): response = yield gen.Task(tasks.sleep.apply_async, args=[3]) self.write(str(response.result)) self.finish()
from https://stackoverflow.com/questions/8202282/tornado-celery-integration-hacks by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] Python에서 벡터화 된 솔루션으로 최대 계산 (0) | 2018.10.21 |
---|---|
[PYTHON] 장고 관리자의 다른 선택 필드를 기반으로 선택 필드 옵션을 제한하는 방법 (0) | 2018.10.21 |
[PYTHON] numpy에서 가우스 커널 행렬을 효율적으로 계산하는 방법은 무엇입니까? (0) | 2018.10.21 |
[PYTHON] 파이썬 버전 전환 (0) | 2018.10.21 |
[PYTHON] PIL 색상을 대체하는 가장 좋은 방법은 무엇입니까? (0) | 2018.10.21 |