[python] Flask-RESTful에서 스케줄링된 작업을 다른 프로세스로 분리하는 방법

Flask-RESTful은 파이썬으로 작성된 웹 애플리케이션을 개발하기 위한 프레임워크입니다. 스케줄링된 작업은 주기적으로 실행되어야 하므로, 이러한 작업을 다른 프로세스로 분리하는 것이 중요합니다. 이를 통해 Flask-RESTful 서버가 계속 응답 가능한 상태를 유지할 수 있습니다.

1. Celery를 사용한 작업 분리

Celery는 파이썬 기반의 분산 작업 큐 시스템으로, 비동기적으로 작업을 실행할 수 있도록 도와줍니다. Flask-RESTful 애플리케이션에서 Celery를 사용하여 스케줄링된 작업을 다른 프로세스로 분리하는 방법은 다음과 같습니다.

1.1 Celery 설치

Celery를 사용하기 위해 먼저 설치해야 합니다. 다음 명령을 사용하여 Celery를 설치합니다.

$ pip install celery

1.2 Celery 설정 파일 생성

Celery를 사용하기 위해선 설정 파일을 만들어야 합니다. 이 설정 파일은 Celery 작업자(worker)에 대한 설정 정보를 포함합니다. 예를 들면, Celery 작업자가 어떤 큐(queue)를 감시해야 하는지나 Redis나 RabbitMQ와 같은 메시지 브로커에 연결해야 하는지를 정의합니다.

# celeryconfig.py

broker_url = 'redis://localhost:6379/0'  # Redis 메시지 브로커 주소
result_backend = 'redis://localhost:6379/0'  # Celery 작업 결과를 저장할 Redis 주소

1.3 작업 정의

Flask-RESTful 애플리케이션에서 스케줄링된 작업을 분리하기 위해 작업 함수를 정의해야 합니다. 작업 함수는 Celery를 사용하여 실행될 비동기 작업입니다. 작업 함수는 @celery.task 데코레이터를 사용하여 정의합니다.

# app/tasks.py

from celery import Celery

celery = Celery('tasks', broker='redis://localhost:6379/0')

@celery.task
def schedule_task():
    # 스케줄링된 작업의 코드를 작성합니다.
    pass

1.4 작업 예약

스케줄링된 작업을 예약하기 위해 시간 기반의 작업 스케줄러를 사용할 수 있습니다. Celery에서는 beat_schedule 설정을 사용하여 작업 예약 정보를 정의할 수 있습니다.

# celeryconfig.py

from datetime import timedelta

beat_schedule = {
    'schedule-task': {
        'task': 'app.tasks.schedule_task',
        'schedule': timedelta(minutes=5),  # 작업 실행 주기
    },
}

1.5 Celery 작업자 실행

Celery 작업자는 Celery 작업을 실행할 수 있는 프로세스입니다. Celery 작업자를 실행하기 위해 터미널에서 다음 명령을 실행합니다.

$ celery -A app.celery worker --loglevel=info

Celery 작업자는 설정 파일에 정의된 설정 정보를 기반으로 작업을 수행합니다.

2. 참고 자료