개발이야기 013. talkit.bank 내가 사용하고 있는 스케쥴러 개선점 도출하기
어제 글에서는 여러가지 스케쥴러는 비교 해보았었는데 문제는 제가 가진 자원이 크지 않다는 점입니다.
그래서 제가 개발을 해보려고 합니다.
제가 지금 파이썬으로 사용하고 있는 스케쥴 중의 하나는 아래와 같습니다.
import os
import time
# 실행할 파일 경로
SELECT_POSTING_SCRIPT = 'python select_postingcuration.py' # postingcuration 글을 하나의 파일로 정리하기
SELECT_POSTING_SCRIPT2 = 'python select_posting_m2e.py' # m2e 글을 하나의 파일로 정리하기
COLLECT_POSTING_SCRIPT = 'python collect_steem_postings.py' # 스팀잇의 특정 사용자들의 글을 수집하기
COLLECT_POSTING_SCRIPT2 = 'python collect_steem_postings_mysql.py' # 스팀잇의 특정 사용자들의 글을 수집하기
VOTING_POSTING_SCRIPT = 'python auto_voting_user_account2.py' # 특정 사용자를 대상으로 Voting 하기
AUTO_POSTING_SCRIPT = 'python auto_posting_postingcuration.py' # postingcuration 글을 하나의 파일로 정리된 내용을 포스팅 하기
AUTO_SUMMARY_M2E_SCRIPT2 = 'python anal_m2e_mysql.py' # 스팀 M2E 그룹의 운동량을 매일 매일 한번 집계를 진행한다.
VOTING_POSTING_SCRIPT4 = 'python auto_voting_from_mysql_kayap.py' # 특정 사용자를 대상으로 Voting 하기
# 스케줄 시간 설정 (아침 9시)
SCHEDULE_HOUR = 4 # 프스팅 큐레이션 시간
SCHEDULE_HOUR2 = 13 # 프스팅 큐레이션 포스팅 시간
SCHEDULE_MINUTE = 0
def run_scheduler():
while True:
# 현재 시간 확인
current_time = time.localtime()
formatted_time = time.strftime("%Y-%m-%d %H:%M:%S", current_time)
print("현재시간 : " + formatted_time)
# collect_postingcuration.py를 매 시간 실행
os.system(COLLECT_POSTING_SCRIPT)
print("Finished running collect_steem_postings.py")
# collect_steem_postings_mysql.py를 매 시간 실행
#os.system(COLLECT_POSTING_SCRIPT2)
#print("Finished running collect_steem_postings_mysql.py")
# auto_voting_user_account2.py를 실행
os.system(VOTING_POSTING_SCRIPT)
print("Finished running auto_voting_user_account2.py")
# auto_voting_user_account2.py를 실행
os.system(VOTING_POSTING_SCRIPT4)
print(f"Finished running {VOTING_POSTING_SCRIPT4}")
# auto_voting_user_account2.py를 실행
#os.system(AUTO_SUMMARY_M2E_SCRIPT2)
#print("Finished running anal_m2e_mysql.py")
# 스케줄 시간에 select_postingcuration.py 실행
if current_time.tm_hour == SCHEDULE_HOUR:
print("Running scheduled task for select_postingcuration...")
# select_postingcuration.py 실행
os.system(SELECT_POSTING_SCRIPT)
print("Finished running select_postingcuration.py")
# select_postingcuration.py 실행
#os.system(SELECT_POSTING_SCRIPT2)
#print("Finished running select_posting_m2e.py")
# 스케줄 시간에 auto_posting_postingcuration.py 실행
# if current_time.tm_hour == SCHEDULE_HOUR2:
# print("Running scheduled task for auto_posting_postingcuration.py...")
# # auto_posting_postingcuration.py 실행
# os.system(AUTO_POSTING_SCRIPT)
# print("Finished running auto_posting_postingcuration.py")
# collect는 매 시간 실행하므로 1시간 대기
time.sleep(1100)
if __name__ == "__main__":
run_scheduler()
Part 1 실행할 프로그램 들 정의
일단 보팅도하고, 자동 포스팅도하고, 뭔가 가져오기도 하는 프로그램들을 Part 1에 나열 합니다.
작은 단위의 프로그램들을 스케쥴러로 사용할때는 좋은데 T.T
프로그램이 늘어나니 귀차니즘이 발생하고 있습니다.
Part 2 실행 되어야 할 시간 정의
일단 저 프로그램을 약 1100초마다 실행하고 있습니다. 그래서 저 프로그램에서는 특정시간마다 실행하는 부분이 다 주석 처리 되어 있습니다.
하지만, 3600초마다 실행하는 부분은 저 부분을 활용하고 있습니다. 하루에 한번 정도 특정한 시간에 실행 되어야함 정도로 이해 하시면 됩니다.
Part 3 프로그램 실행
그리고 마지막 파트는 While Loop 문으로 프로그램을 계속 실행 합니다.
1시간마다 실행되어야할 아이들, 30분마다 실행되어야할 아이들 20분 정도마다 실행되어야 할 아이들 등이 다양하고 저는 이 스케쥴을 시간대별로 프로그램을 나눠서 관리하고 있습니다.
개선 해야 할 점
확장성 고려
저 프로그램에 Part1, Part2 있는 부분을 데이터베이스에 정의할 수 있도록 확장이 필요 합니다.
MySQL로 디비화 할 계획입니다.
정확한 시간 고려
현재는 해당 시간을 실행하고, 멀티 Thread로 실행하지 않고, Single Thread로 처리하고 있어서 이게 실제 프로그램의 실행시간이 스케쥴에 들어 갑니다.
리눅스의 백그라우드 실행을 하거나, 파이썬의 멀티 쓰레드를 고려해서 프로그램을 수정할 필요가 있습니다.
스케쥴 등록 방법을 cron 친화적으로 변환
지금 저는 스케쥴 자체를 시간대 별로 나눠두었지만, cron은
* * * * * talkit python3 aaa.py
첫번째 : 분
두번째 : 시
세번째 : 일
네번째 : 월
다섯번째 : 주
위와 같은 거 많이 보셨을 겁니다.
cron이 스케쥴을 정의하는 방법 입니다.
위 스케쥴은 매분마다 aaa.py를 실행하라는 명령 입니다.
제가 개밸한 제품이 다른 분들도 편하게 사용할 수 있도록 cron 친화적으로 개발을 고려해야할 것 같습니다.
WEB UI에 대한 고려
이건 부가적인 것이라고 생각하는데 데이터베이스를 이용하려면 WEB UI가 제일 좋습니다.
그런데, 스케줄러를 위해서 DB도 있어야하고, 웹서버도, WAS서버도 있어야해서 이게 제일 고민 입니다.
제가 사용자 관리하는 프로그램 처럼 python CLI를 이용해서 작성하는 방법도 고려 해보겠습니다.
맺음말
시간이 걸릴 것 같지만, 위와 같은 프로그램을 한번 작성해봐야겠습니다.
다른게 다 안되면 기본적으로 프로그램이라도 MySQL에 제가 강제로 등록하고, 실행을 DB에서 불러와서 하는 방향으로요.
그러면, 일단 스케쥴러에 새로운 프로그램이 등록되면 제가 재시작을 명령어로 하고 있는데 이걸 안해도 될 것 같습니다.
감사합니다.
Posted through the ECblog app (https://blog.etain.club)
Upvoted! Thank you for supporting witness @jswit.