[python] Tornado와 멀티스레딩의 활용

Tornado는 Python 기반의 비동기 웹 프레임워크로, 고성능의 네트워크 응용 프로그램을 개발할 때 많이 사용됩니다. 하지만 Tornado는 기본적으로 단일 스레드에서 동작하기 때문에, CPU 집약적인 작업을 수행하는 경우에는 성능이 저하될 수 있습니다. 이러한 상황에서 멀티스레딩을 활용하여 성능을 향상시킬 수 있습니다.

Tornado와 멀티스레딩

Tornado는 I/O 지향적인 구조를 가지고 있으며, 기본적으로 단일 스레드에서 이벤트 루프를 통해 비동기 처리를 수행합니다. 하지만 CPU 집약적인 작업의 경우 이벤트 루프를 차단하는 문제가 발생할 수 있습니다. 이러한 문제를 해결하기 위해서는 Tornado의 ThreadPoolExecutor 클래스를 사용하여 멀티스레딩을 구현할 수 있습니다.

from concurrent.futures import ThreadPoolExecutor
import tornado.web
import tornado.ioloop

class MyHandler(tornado.web.RequestHandler):
    executor = ThreadPoolExecutor(max_workers=4)

    async def get(self):
        result = await self.run_blocking_task()
        self.write(result)

    async def run_blocking_task(self):
        # CPU 집약적인 작업 수행
        return "Result"

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

ThreadPoolExecutor 클래스를 사용하여 최대 4개의 워커 스레드를 생성하고, MyHandler 클래스에서 비동기 처리되어야 할 작업을 run_blocking_task 메서드에 작성합니다. 이렇게 작성된 코드는 Tornado의 이벤트 루프를 차단하지 않고 멀티스레딩을 통해 작업을 수행하므로, 성능 향상을 기대할 수 있습니다.

참고 자료