ทำ Python schedule job ด้วย APScheduler
ทั้งแบบ cron job และ interval job อย่างง่าย
คงจะมีบางครั้งใช่ไหมครับ ที่เราอยากให้โปรแกรมที่เราเขียนขึ้นมาทำงานภายในเวลาที่กำหนดเช่นอาจจะเป็น ทุกๆ วัน ทุกๆ ชั่วโมง หรือทำซ้ำภายในเวลาเท่านั้น เท่านี้
เพราะมันเป็นเรื่องที่ดูน่าเบื่อมากหากเราต้องมารันคำสั่งแบบเดิม ๆ ตลอดเวลา
cron job กับ interval job ต่างกันอย่างไร?
cron job
จะกำหนดรอบการทำงานเป็น ณ เวลาเท่านี้เช่น ทุกบ่ายโมง หรือทุกเที่ยงคืนของแต่ละวันโดยไม่สนใจเวลาของการเริ่มต้นโปรแกรม
interval job
จะกำหนดรอบการทำงานเป็น ทุก ๆ ช่วงเวลาเช่น 30 วินาทีหรือ 1 นาทีและขึ้นอยู่กับเวลาที่เริ่มต้นการรันโปรแกรม
ขั้นตอนการทำ python schedule job ด้วย APScheduler
เราจะต้องลง plug-in ของ python ก่อนด้วยคำสั่ง pip3 install APScheduler
ข้างล่างนี้คือ code ตัวอย่างเพื่อให้เข้าใจการทำงาน
1 import time
2 import atexit
3
4 from apscheduler.schedulers.background import BackgroundScheduler
5
6 def print_time():
7 print(time.strftime("%A, %d. %B %Y %I:%M:%S %p"))
8
9 scheduler = BackgroundScheduler()
10
11 scheduler.add_job(func=print_time, trigger="interval", seconds=3)
12
13 scheduler.start()
14
15 # Shut down the scheduler when exiting the app
16 atexit.register(lambda: scheduler.shutdown())
ตรงบรรทัดที่ 11 ที่เราทำการ add_job เข้ามานั้นเราสามารถเลือกได้ว่าจะให้ trigger เป็นแบบ cron
หรือ interval
และหลังจาก trigger จะเป็นการกำหนดว่า task นั้นจะทำในช่วงเวลาเท่าใด
ตัวอย่างการตั้งค่าการใช้งาน
โดยถ้าเราเลือกเป็น cron
จะกำหนดเป็น year, month, day, hour, minute, second
ตามด้วยเวลาที่ต้องการให้มีการทำงาน ยกตัวอย่างเช่น
# ทำงานทุก ๆ 1 นาที
scheduler.add_job(func=print_time, trigger="cron", minute='*')# ทำงานทุก ๆ 15 วินาที
scheduler.add_job(func=print_time, trigger="cron", second='*/15')# ทำงานทุก ๆ บ่ายโมงครึ่ง
scheduler.add_job(func=print_time, trigger="cron", hour='13', minute='30')
โดยถ้าเราเลือกเป็น interval
จะกำหนดเป็น years, months, days, hours, minutes, seconds
ตามด้วยเวลาที่ต้องการให้มีการทำงาน ยกตัวอย่างเช่น
# ทำงานทุก ๆ 1 นาที
scheduler.add_job(func=print_time, trigger="interval", minutes=1)# ทำงานทุก ๆ 15 วินาที
scheduler.add_job(func=print_time, trigger="interval", seconds=15)
จะเห็นว่าการใช้งานแบบ interval
ไม่สามารถตั้งให้ทำงานในเวลาใด ๆ ได้ แต่จะทำงานเป็นรอบตามเวลาที่กำหนดเท่านั้น การใช้งาน schedule job
ก็ขึ้นอยู่กับว่าเราต้องการใช้งานแบบใด