나는 이렇게 학습한다/Library

APScheduler를 이용해 비동기 작업을 예약하자

daco2020 2022. 1. 18. 18:57
반응형

APScheduler 란?

APScheduler는 Advanced Python Scheduler의 줄임말로 스케줄을 예약하여 실행할 수 있도록 돕는 라이브러리이다.

예를 들어 특정 시간에 실행시키고 싶은 코드가 있다거나, 일정 간격으로 수행해야 하는 코드가 있다면 이 라이브러리를 유용하게 사용할 수 있다.

특히 기존 스케줄러와 가장 큰 차이점이자 장점은 while과 같은 무한루프를 돌리지 않아도 코드를 비동기적으로 실행시킬 수 있다는 점이다!


실습

아래 실습 코드를 통해 사용법을 살펴보자

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


#-----
#스케줄 실행 코드
def scheduler():
    print("Scheduler is alive!")

schedule = BackgroundScheduler(daemon=True, timezone='Asia/Seoul')
schedule.add_job(scheduler, 'interval', seconds=3)
schedule.start()
#-----



#-----
#flask 서버 실행 코드
app = Flask(__name__)

@app.route("/", methods=["GET"])
def ping():
    return "뀽뀽뀽"

if __name__ == '__main__':
    app.debug = True
    app.run()
#-----



먼저 스케줄을 사용하기 위해 라이브러리를 import한다

# apscheduler 설치 필수! 
from apscheduler.schedulers.background import BackgroundScheduler 

# flask 서버도 함께 돌려보자! 
from flask import Flask



그다음 스케줄로 실행할 함수와 스케줄을 설정하는 코드를 작성해보자

#스케줄 실행 코드 
def scheduler(): 

    # 출력할 문구 
    print("Scheduler is alive!") 
    
# timezone을 설정해두지 않으면 경고문구가 뜰 수 있다! 
# BackgroundScheduler을 통해 schedule 인스턴스를 생성한다. 
schedule = BackgroundScheduler(daemon=True, timezone='Asia/Seoul') 
    
# 추가하고 싶은 작업을 add_job 매서드를 통해 설정한다. 
# 이 코드는 2초 간격으로 실행하라는 의미이다 
schedule.add_job(scheduler, 'interval', seconds=2) 
    
# 스케줄을 start()로 호출한다 
schedule.start()



flask 서버를 열어 스케줄 실행 중에도 다른 요청 작업이 가능한지 알기 위해 다음 코드를 추가한다

#flask 서버 실행 코드
app = Flask(__name__)

# '/' endpoint로 요청이 들어오면 "뀽뀽뀽"을 반환한다
@app.route("/", methods=["GET"])
def ping():
    return "뀽뀽뀽"

if __name__ == '__main__':
    app.debug = True
    app.run()




결과

최종적으로 이 파이썬 파일을 실행하면 어떤 일이 일어날까?

Scheduler is alive! 
127.0.0.1 - - [18/Jan/2022 18:51:38] "GET / HTTP/1.1" 200 - 
Scheduler is alive! 
127.0.0.1 - - [18/Jan/2022 18:51:40] "GET / HTTP/1.1" 200 - 
Scheduler is alive! 
Scheduler is alive! 
127.0.0.1 - - [18/Jan/2022 18:51:42] "GET / HTTP/1.1" 200 - 
Scheduler is alive! 
Scheduler is alive! 
Scheduler is alive! 
127.0.0.1 - - [18/Jan/2022 18:51:47] "GET / HTTP/1.1" 200 - 
Scheduler is alive! 
Scheduler is alive! 
Scheduler is alive! 
Scheduler is alive! 
Scheduler is alive!


실제 터미널에서 실행한 출력 값이다.

스케줄은 계속 반복되지만 그 사이에 flask서버를 통해 다른 요청을 받을 수 있는 걸 볼 수 있다.
이처럼 비동기적으로 작업을 수행해야 할 때 APScheduler을 활용하면 원하는 작업을 수행할 수 있다.



반응형