SW/Python

Python : APScheduler : missed job : 에러, 원인, 해결법

얇은생각 2020. 2. 13. 07:30
반응형

APScheduler

 

sched = BlockingScheduler(misfire_grace_time=3600, coalesce=True)
sched.add_jobstore('mongodb', collection='my_jobs')

@sched.scheduled_job('cron', hour=3, id='validation')
def validation():
    rep = Myclass()
    rep.run()

if __name__ == '__main__':
    sched.start()

 

위와 같이, 파이썬에서 제공해주는 스케쥴러 라이브러리를 활용하고 있습니다. 서버에서 필요할 때마다 스케쥴러를 짜서, 호출 시켜 활용하고 있습니다. 하지만, 서버가 성능이 상대적으로 낮거나, 프로세스가 많은 경우, 스케쥴러를 실행시키지 못하고 넘어가는 경우가 있었습니다. 

이렇게 그냥 넘어가리면, 제 애플리케이션에는 치명적인 문제로 작용하였습니다. 그렇다고, 서버 성능을 올리기에는 금전적인 문제가 작용하였습니다. 고작 실행을 위해서, 성능을 올리기에는 납득이 가지 않는 상황이었습니다.

 

 

 

Run time of job "validation (trigger: cron[hour='3'], next run at: 2016-12-30 03:00:00 CST)" was missed by 0:00:02.549821

 

바로 위와 같은 에러를 내뿜으며, 실행되지 않는 것이었습니다. 관련 스택오버플로우와 문서를 읽어보았습니다. 

 

 

 

https://apscheduler.readthedocs.io/en/stable/modules/job.html

 

apscheduler.job — APScheduler 3.6.3 documentation

© Copyright Alex Grönholm Revision 028506a8.

apscheduler.readthedocs.io

 

misfire_grace_time (int) – the time (in seconds) how much this job’s execution is allowed to be late

 

해당 문서를 읽어보니 다음과 같은 파라미터를 제공하고 있었습니다. 해당 잡의 실행을 얼마나 늦게 실행해도 되는지 정의할 수 있는 파라미터였습니다. 정해진 시간에 실행이 되지 않아도 되고, 시간의 중요성이 조금 덜하다면 해당 파라미터를 활용하면 문제를 해결할 수 있을 것으로 판단되었습니다.

다만, 무조건 해당 시간에 시작이 되야만 하는 프로그램이면 어떻게 할까요..? 다른 라이브러리를 활용한다던지, 아니면 프로세서와 프로세스를 넉넉하게 가져가는 방법 밖에 떠오르지 않았습니다. 제 프로그램 역시 주식 투자 프로그램이기 떄문에, 시간이 매우 중요하게 작용합니다.

다만, 실행이 되지 않는다면, 심각한 금전적인 피해를 입을 수 있기 떄문에, 조금 늦게 시작하더라도, 딜레이 시간을 허용함으로써 문제를 해결하고자 하였습니다. 현재 새롭게 해당 방식을 적용중에 있으며, 과연 해당 문제가 완벽히 해결될지 확인해보도록 하겠습니다.

아래는 레퍼런스 문서에서 제공해주는 관련 내용을 번역하여 말씀드립니다.

 

 

 

누락된 작업 실행 및 통합

때때로 스케줄러는 스케줄 된 작업을 실행하지 못할 수 있습니다. 가장 일반적인 경우는 영구 작업 저장소에서 작업이 스케줄되고 작업 실행 후 스케줄러가 종료되었다가 다시 시작되는 경우입니다. 이런 일이 발생하면 해당 작업은“실패”한 것으로 간주됩니다. 그런 다음 스케줄러는 누락 된 각 실행 시간을 작업의 misfire_grace_time 옵션과 비교하여 실행이 여전히 트리거되어야하는지 확인합니다. 이로 인해 작업이 여러 번 연속으로 실행될 수 있습니다.

이 동작이 특정 사용 사례에 바람직하지 않은 경우 병합을 사용하여 누락 된 모든 실행을 하나로 롤링 할 수 있습니다. 즉, 작업에 대한 병합이 활성화되어 있고 스케줄러가 작업에 대해 하나 이상의 대기된 실행을 보는 경우 한 번만 트리거합니다.

풀에서 사용 가능한 스레드 또는 프로세스가 없어 작업 실행이 지연되는 경우, 실행기는 너무 늦게 실행되어 (원래 지정된 런타임과 비교하여) 작업을 건너 뛸 수 있습니다. 애플리케이션에서 이런 일이 발생할 가능성이 높으면 실행 프로그램의 스레드 / 프로세스 수를 늘리거나 misfire_grace_time 설정을 더 높은 값으로 조정해야 합니다.

반응형