복붙노트

[PYTHON] 토네이도 셀러리 통합 해킹

PYTHON

토네이도 셀러리 통합 해킹

아무도이 게시물에 해결 방법을 제공 했으므로 필자가 필사적으로 해결 방법이 필요하다는 사실을 알기에 여기에 내 상황과 토론을위한 몇 가지 추상적 인 솔루션 / 아이디어가 있습니다.

내 스택 :

내 문제 : 토네이도가 샐러리 작업을 파견하고 (해결 된) 결과를 비동기식으로 모을 수있는 방법을 찾는다.

시나리오 1 : (요청 / 응답 해킹 + 웹 훅)

이것이 일어날 수 있습니까? 어떤 논리가 있습니까?

시나리오 2 : (토네이도 플러스 롱 폴링)

이것이 효율적입니까?

다른 아이디어 / 스키마?

해결법

  1. ==============================

    1.나는이 질문에 비틀 거리며 결과 백엔드를 반복적으로 치는 것이 나에게 최적으로 보이지 않았다. 그래서 유닉스 소켓을 사용하는 시나리오 1과 비슷한 믹스 인을 구현했습니다.

    나는이 질문에 비틀 거리며 결과 백엔드를 반복적으로 치는 것이 나에게 최적으로 보이지 않았다. 그래서 유닉스 소켓을 사용하는 시나리오 1과 비슷한 믹스 인을 구현했습니다.

    작업이 끝나자 마자 토네이도에 알려주고 (체인의 다음 작업이 실행되는 즉시 정확함) 결과 백엔드 한 번만 치게됩니다. 여기 링크가 있습니다.

  2. ==============================

    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. ==============================

    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. ==============================

    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()
    
  5. from https://stackoverflow.com/questions/8202282/tornado-celery-integration-hacks by cc-by-sa and MIT license