코딩하는 문과생

[Python] python-batch-runner, 파이썬 배치 관리 본문

프로그래밍/Python

[Python] python-batch-runner, 파이썬 배치 관리

코딩하는 문과생 2021. 4. 25. 22:29

파이썬 배치 스크립트 작성 후, 여러 파일을 순차적으로 호출하는 일이 필요해졌다.

처음에는 crontab을 이용해 하나씩 호출하려 했으나 관리가 될까 의문이 들었고, 여러 서치 끝에 python-batch-runner라는 모듈을 발견해 이를 적용해보기로 했다.

 

우선 국내 자료가 하나도... 없어서 doc과 stackoverflow를 최대한 참조하면서 개발을 진행했다.

 

[순서]

 

1. 우선 pip를 이용해 모듈을 다운 받는다.

pip install python-batch-runner

 

2. 설치가 완료된다음 다음 명령어를 입력하면 프로젝트명과 프로젝트 경로를 지정한다.

$ pyrunner --setup
ProjectName : updatedaybatch
ProjectPath : updateDay

- 처음에 잘 몰라서 프로젝트명만 입력하고 프로젝트는 경로는 그냥 넘겼는데, 나중에 알고보니 프로젝트 경로에 현재 개발중인 폴더를 작성하면 그 폴더 내에 배치와 관련된 설정파일들이 생성된다. (그냥 넘기면 현재 터미널에 있는 경로로 우선 생성된다.)

프로젝트명, 경로를 입력하고 생성된 초기버전에서 필요한 배치파일만 worker폴더 아래로 위치 시켰다. 

 

3. task.py라는 파일을 생성한다. Doc에는 나와있지 않지만 task.py는 python batch runner를 관리하기 위해 본인이 생성한 파일이다. 배치가 많이 없다면 필요없겠지만 배치가 많다면 저렇게 하나의 Runner전용 파일을 만들어 관리하는 것도 괜찮은 거 같다.

-task.py

: Worker를 상속받아 구동시킬 배치를 run 메서드 안에 작성한다. 

from pyrunner import Worker
import TimingDBUpdaterKR
import TimingDayAnalysis
import TimingDayNotify

class DBUpdateKR(Worker):
  def run(self):
    tuk = TimingDBUpdaterKR.TimingDBUpdaterKR('KR')
    tuk.execute_daily()

class DBAnalysisKR(Worker):
  def run(self):
    tda = TimingDayAnalysis.TimingDayAnalysis('KR')
    tda.analysis_stocks_volume()

class DBNotifyKR(Worker):
  def run(self):
    tdn = TimingDayNotify.TimingDayNotify('KR')
    tdn.get_analysis_list()
    tdn.notify_user()

 

4. 배치 리스트를 작성한다.

- updatedaybatch.lst

: 실제 구동시켜야 하는 배치목록들을 작성한다.

#PYTHON
#ID|PARENT_IDS|MAX_ATTEMPTS|RETRY_WAIT_TIME|PROCESS_NAME|MODULE_NAME|WORKER_NAME|ARGUMENTS|LOGFILE

1|-1|1|0|Update DB KR|task|DBUpdateKR||$ENV{APP_LOG_DIR}/DBUpdateKR.log
2|1|1|0|Analysis DB KR|task|DBAnalysisKR||$ENV{APP_LOG_DIR}/DBAnalysisKR.log
3|2|1|0|Notify DB KR|task|DBNotifyKR||$ENV{APP_LOG_DIR}/DBNotifyKR.log

 

  • ID: 배치구동 시켜야할 목록을 구분짓기위한 ID 값, 그냥 1,2,3,4...넣어주면 된다.
  • PARENT_IDS: 여기서 본인이 필요한 설정을 할 수 있었다. 배치 파일이 여러개이고, 모든 파일이 동기적으로 진행되어야 했기에 순서가 항상 보장되어야 했었는데, parent_id를 통해 순서를 보장할 수 있었다.(1이라고 작성하면 1번 배치 이후 구동되어야 한다는 의미, 2, 3이렇게 복수개도 가능하다.)
  • MAX_ATTEMPT: 실패하는 시 최대 재시도 횟수
  • RETRY_WAIT_TIME: 재기동시 기다리는 시간
  • PROCESS_NAME: 아무 이름이나 지어주면 된다.
  • MODULE_NAME: 구동시키려는 파일 중 .py를 제거한 이름명을 작성하면 된다.(여기서는 run가 포함된 task)
  • WORKET_NAME: 실제 구동 시키려는 class이름을 작성하면 된다.(task 파일 내 클래스명을 적어주면 된다.)
  • ARGUMENT: 필요한 매개변수 입력
  • LOGFILE: 배치구동 시 저장되는 로그파일 경로와 이름 지정

 

5. 아래명령어로 배치를 구동시킨다.

: 배치 로그가 터미널에 찍힌다. (현재까지 성공, 진행중, 실패된 배치 갯수 파악이 가능하다.)

$ pyrunner -c updateDay/updatedaybatch/config/app_profile -l updateDay/updatedaybatch/config/updatedaybatch.lst

대기중 1개, 구동중 1개 배치가 조회된다.(예시에서 3번 배치는 주석처리하고 구동시킴)

6. 성공 또는 실패, 또한 배치 작동중에 logs 폴더 내에 배치와 관련된 로그들이 쌓인다.

작동중 로그를 확인하고 싶은 경우, 아래 명령어를 이용해 확인이 가능하다.

$ tail -f XXX(로그명)

성공 또는 실패로그가 계속 쌓인다.

 

7. 해당 명령어를 crontab으로 등록한다.(아직 미등록)

pyrunner -c /timing-batch/config/app_profile -l /timing-batch/config/timing-batch.lst