본문 바로가기

정리/구현

[Python] Flask Batch Scheduler 구현

728x90

Flask로 Batch Scheduler를 구현하는 방법입니다.

Flask 란 ? 

Flask는 파이썬으로 작성된 경량 웹 프레임워크입니다. 웹 애플리케이션을 빠르게 개발하고 구축할 수 있도록 설계되었습니다. Request-Response 모델을 따르며, URL 라우팅, 템플릿 엔진, 세션 관리 및 다양한 확장을 제공합니다.

결국 RestfulAPI 구현하기 위해 자주 사용하는 프레임 워크입니다.

 

 

 

 

 

[목차]

1. Batch Scheduler 설명, 구현 방법 소개

2. flask , Batch Scheduler  분리 구현

3. flask , Batch Scheduler  통합 구현

 

 

 

 

 

1. Batch Scheduler 설명

Batch Scheduler 란 ?

Batch Scheduler는 정기적으로 실행해야 하는 작업을 예약하고 실행하는 시스템 또는 도구를 의미합니다.
일괄 처리 작업은 백그라운드에서 자동으로 실행되며, 주기적으로 데이터 처리, 백업, 정기적인 작업 등을 수행하는 데 사용됩니다. 일괄 처리 스케줄러는 주어진 일정 또는 조건에 따라 작업을 실행하고, 실행된 결과를 모니터링하거나 기록할 수 있습니다.

예를 들어,

- 1시간 마다 나의 이메일을 검사하고 첨부파일을 다운로드 받아 정리해주는 프로그램

- 오후 5시면 한국 주식 데이터를 조회하여 그날의 마켓 현황을 정해진 룰로 정리해주는 프로그램  등등

이런 것들을 수행하는 서비스를 가리킵니다.

 

 

2. flask , Batch Scheduler 분리 구현

여기서 Flask 에서 Batch Scheduler 를 구현 한다는 것은 다음을 의미 합니다.

Flask app 서버가 실시간으로 떠있는 상황에서 특정 Batch 가 돌아야하는지 계속 관리해주는 영역도 같이 떠있는 것을 의미합니다. 그렇다고해서 두 서비스가 통합되어 있어야 하는 것을 의미 하는 것은 아닙니다.

from flask import Flask
app = Flask(__name)

@app.route('/')
def hello():
    return "Hello, World!"

if __name__ == '__main__':
    app.run()
from apscheduler.schedulers.blocking import BlockingScheduler

def scheduled_task():
    print("Scheduled task is running...")

scheduler = BlockingScheduler()
scheduler.add_job(scheduled_task, 'interval', seconds=60)
scheduler.start()

이렇게 하면 Flask 서버와 스케줄러가 분리되고, 스케줄된 작업은 별도의 백그라운드 프로세스에서 실행됩니다.

 

 

 

3. flask, batch scheduler 통합 구현

 

통합 구현 방식은 간단한 설정과 통합 용이성으로 유용한 면이 있습니다.

 Flask 앱 내에서 스케줄러를 설정하고 실행하는 것은 상대적으로 간단하며 Flask 앱의 구조를 유지하고 모듈화하기 쉽습니다. 스케줄링된 작업과 Flask 앱의 다른 구성 요소 사이에 데이터 및 로직을 쉽게 공유할 수 있으며, Flask 앱과 스케줄러가 함께 가동됩니다.

 하지만 싱글 프로세스 구현으로 서로 영향을 줍니다. 확장성도 낮습니다. 개별영역의 확장이 필요할때 같이 통합 확장을 고민해야합니다. 그리고 복잡성도 늘어날 수 있습니다.

 

 

사용하는 python package는 apscheduler 입니다.

* from apscheduler.schedulers.background import BackgroundScheduler

위 내용을 app 실행 코드 app.py 또는 __init__.py 최상단에 입력합니다.

 

from flask import Flask
from apscheduler.schedulers.background import BackgroundScheduler



def scheduled_task():
    print("Scheduled task is running...")

def create_app(debug=False):
    # ...
    app.Flask(__name__)
    cors= CORS(app)

    scheduler = BackgroundScheduler()
    scheduler.add_job(scheduled_task, 'interval', seconds=60)  # 매 60초마다 실행
    scheduler.start()

    return app

if __name__ == '__main__':
    app = create_app('development')
    app.run()

 

interval 외에도 다음처럼 cron 으로 구현도 가능합니다.

 

 

 

 

만약 분리 구현할 경우,  batch 에서 수행하는 서비스가 flask 서버내에서 수행해야한다면 batch에서 flask 로 요청할 수 있는 구조도 개발을 해야합니다. 따라서 각 구현 방식 중 어느 방식이 좋을 지는 충분히 고민해보고 진행하는 것이 좋겠습니다.

 

 

PS : apscheduler 라이브러리 외에도 다른 라이브러리가 많습니다. Celery, rq-scheduler 도 있습니다.

해당 라이브러리가 어떻게 다른지는 다른 포스트에서 설명을 하겠습니다.

감사합니다.