2014-01-28 2 views
0

나는 다음과 같은 객체 인스턴스화 비동기 할 수있는 방법 :비동기 객체 인스턴스화

class IndexHandler(tornado.web.RequentHandler): 
    def get(self, id): 
     # Async the following 
     data = MyDataFrame(id) 
     self.write(data.getFoo()) 

MyDataFrame 리턴한다 pandasDataFrame 오브젝트를하고 구문 분석하는 파일에 따라 약간의 시간이 걸릴 수 있습니다.

+1

'MyDataFrame'에서 구현해야하며, 생성자는 차단 대신 Tornado의 이벤트 루프를 이용하기 위해 완전한 다시 쓰기가 필요할 것입니다. – lanzz

답변

2

MyDataFrame()은 동기식 인터페이스입니다. 차단하지 않고 사용하려면 다음 두 가지 중 하나를 수행해야합니다.

  • 비동기로 다시 작성하십시오. __init__ 메서드를 비동기로 만들 수는 없으므로 생성자 대신 정적 팩토리 함수로 리팩토링해야합니다. 대부분의 경우이 경로는 네트워크 I/O에 의존하고 (파일 시스템에서 읽거나 CPU에서 결과를 처리하지 않는 경우에만) 의미가 있습니다.

  • 작업자 스레드에서 실행하고 비동기 적으로 주 스레드에서 결과를 기다립니다. 당신이 질문을 짜내는 방식에서, 이것은 당신에게 맞는 접근법처럼 들립니다. concurrent.futures 패키지 (Python 3.2 이후로 표준 라이브러리에 있음, 2.x는 pip install futures)를 사용하는 것이 좋습니다.

이 같이 보일 것입니다 : executorThreadPoolExecutor의 글로벌 인스턴스

@tornado.gen.coroutine 
def get(self, id): 
    data = yield executor.submit(MyDataFrame, id) 
    self.write(data.getFoo()) 

.