[python] Tornado와 Celery를 이용한 비동기 작업 처리

이번 글에서는 Tornado와 Celery를 함께 사용하여 비동기 작업을 처리하는 방법에 대해 알아보겠습니다. 비동기 작업을 처리하기 위해서는 Tornado의 비동기 기능을 활용하고, Celery를 사용하여 작업을 백그라운드로 실행할 수 있습니다. 이를 통해 웹 애플리케이션의 응답 속도를 향상시킬 수 있습니다.

Tornado란?

Tornado는 파이썬으로 작성된 비동기 웹 프레임워크입니다. 비동기 요청 및 응답 처리의 성능이 뛰어나며, 기본적으로 비동기 I/O를 지원합니다. 이러한 특징으로 인해 Tornado는 대용량 트래픽을 처리해야 하는 웹 애플리케이션에 적합합니다.

Celery란?

Celery는 분산 작업 처리를 위한 비동기 작업 큐입니다. 작업을 큐에 넣은 후 워커가 이를 처리하며, 백그라운드에서 작업을 수행하므로 웹 애플리케이션의 응답 시간이 단축됩니다. Celery는 파이썬에서 주로 사용되며, 다양한 백엔드(Broker)를 지원합니다.

설정하기

먼저 Tornado와 Celery를 설치해야 합니다. 아래 명령을 사용하여 설치할 수 있습니다.

pip install tornado celery

설치가 완료되었다면, Tornado 앱과 Celery 앱을 각각 설정하겠습니다.

Tornado 앱 설정

Tornado 앱을 설정하기 위해 다음과 같이 코드를 작성합니다.

import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, Tornado!")

def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
    ])

if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

위의 코드는 간단한 Tornado 앱을 생성하는 예시입니다. 루트 URL(“/”)로 요청이 들어오면 “Hello, Tornado!”를 응답합니다.

Celery 앱 설정

Celery 앱을 설정하기 위해 다음과 같이 코드를 작성합니다.

from celery import Celery

app = Celery('tasks', broker='amqp://guest@localhost//')

@app.task
def add(x, y):
    return x + y

위의 코드는 Celery 앱을 생성하고, add라는 태스크를 정의하는 예시입니다. 이 태스크는 받은 두 개의 인자를 더하여 결과를 반환합니다.

비동기 작업 실행하기

Tornado 앱과 Celery 앱을 설정했으므로, 이제 비동기 작업을 실행해보겠습니다.

import tornado.ioloop
import tornado.web
from celery import group

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        # Celery 작업 생성
        job = group(add.s(1, 2) for _ in range(10))
        
        # Celery 작업 실행
        result = job.apply_async()
        
        self.write("Job ID: {}".format(result.id))

def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
    ])

if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

위의 코드는 Tornado 앱을 수정하여 비동기 작업을 실행하는 예시입니다. group을 사용하여 여러 개의 add 태스크를 생성하고, 이를 Celery 작업으로 실행합니다. 작업이 완료되면 결과의 ID를 응답으로 반환합니다.

결과 확인하기

Tornado 앱을 실행한 후 웹 브라우저에서 http://localhost:8888에 접속하면 “Job ID”와 함께 작업 ID가 보여집니다. 이를 통해 작업이 비동기적으로 실행되었음을 확인할 수 있습니다.

마무리

이렇게 Tornado와 Celery를 이용하여 비동기 작업을 처리하는 방법을 알아보았습니다. Tornado의 비동기 기능과 Celery의 분산 작업 처리를 활용하면 웹 애플리케이션의 응답 속도를 향상시킬 수 있습니다. 추가적인 기능이나 세부 설정은 공식 문서를 참고하면 도움이 될 것입니다.

참고 자료