[파이썬] Tornado에서의 스트리밍 응답

Tornado Logo

Tornado는 Python으로 작성된 웹 프레임워크로, 비동기 웹 서버를 구축하는 데 사용됩니다. 이 포스트에서는 Tornado를 사용하여 스트리밍 응답을 구현하는 방법에 대해 알아보겠습니다.

스트리밍이란?

스트리밍은 데이터를 조각조각 나누어 전송하는 방식으로, 사용자는 데이터 전송이 완료되지 않았더라도 일부분을 받아볼 수 있습니다. 이는 대용량 파일이나 실시간 데이터와 같은 경우에 유용합니다.

Tornado에서의 스트리밍 응답 구현

Tornado는 비동기적으로 동작하며, 지원하는 RequestHandler에서 스트리밍 응답을 구현할 수 있습니다. 아래는 간단한 예제 코드입니다.

import tornado.web
import tornado.gen

class StreamHandler(tornado.web.RequestHandler):
    @tornado.gen.coroutine
    def get(self):
        stream = self.application.my_stream()
        
        # 스트리밍 시작
        while True:
            chunk = yield stream.read_chunk()
            if not chunk:
                break
            self.write(chunk)
            yield self.flush()

        # 스트리밍 완료
        self.finish()

    # 스트리밍 데이터 생성
    def my_stream(self):
        # 스트리밍 데이터 생성 로직을 구현합니다.
        # 예를 들어, 대용량 파일을 읽어 데이터를 조각조각 생성하거나,
        # 외부 API를 통해 실시간 데이터를 가져와 스트리밍할 수 있습니다.

위 코드에서 StreamHandlertornado.web.RequestHandler를 상속하여 만들었습니다. get 메서드에서 스트리밍 응답을 구현하였습니다.

my_stream 메서드는 실제로 스트리밍 데이터를 생성하는 로직을 구현한 메서드로, 커스텀하게 작성해야합니다. 이 예제에서는 데이터를 조각조각 생성하여 반환하도록 되어 있습니다.

스트리밍 데이터를 생성한 후, yield stream.read_chunk()을 통해 데이터를 읽어옵니다. 만약 더 이상 읽을 데이터가 없다면 break하여 스트리밍을 종료합니다. 그렇지 않은 경우 write 메서드로 클라이언트에 데이터를 작성하고, flush 메서드를 통해 데이터를 클라이언트로 전송합니다. 이후 다음 데이터를 읽어올 준비를 하고 반복합니다. 스트리밍이 끝나면 finish 메서드를 호출하여 응답을 종료합니다.

스트리밍 응답 사용하기

위에서 정의한 StreamHandler를 Tornado 애플리케이션에 등록하여 사용할 수 있습니다. 예를 들어, tornado.web.Application을 생성하고 StreamHandler를 URL 패턴에 매핑하는 방식으로 사용할 수 있습니다.

import tornado.ioloop
import tornado.web

if __name__ == "__main__":
    app = tornado.web.Application([
        (r"/stream", StreamHandler),
    ])
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

위 코드에서 /stream URL 패턴에 StreamHandler를 매핑하였습니다.

마치며

이번 포스트에서는 Tornado에서 스트리밍 응답을 구현하는 방법에 대해 알아보았습니다. 비동기적으로 동작하는 Tornado를 활용하면 대용량 파일 전송이나 실시간 데이터와 같은 경우에도 효율적으로 처리할 수 있습니다. Tornado가 가지고 있는 다양한 기능들을 활용하여 웹 애플리케이션을 개발해보세요. Happy coding!