ทำ Python schedule job ด้วย APScheduler

ทั้งแบบ cron job และ interval job อย่างง่าย

Tanabodin Kamol
iCreativeSystems
Published in
1 min readApr 24, 2019

--

คงจะมีบางครั้งใช่ไหมครับ ที่เราอยากให้โปรแกรมที่เราเขียนขึ้นมาทำงานภายในเวลาที่กำหนดเช่นอาจจะเป็น ทุกๆ วัน ทุกๆ ชั่วโมง หรือทำซ้ำภายในเวลาเท่านั้น เท่านี้

เพราะมันเป็นเรื่องที่ดูน่าเบื่อมากหากเราต้องมารันคำสั่งแบบเดิม ๆ ตลอดเวลา

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 ก็ขึ้นอยู่กับว่าเราต้องการใช้งานแบบใด

REFERENCE

  1. https://apscheduler.readthedocs.io/en/latest/userguide.html

--

--

Tanabodin Kamol
iCreativeSystems

I always self-study about electronic devices and computer programming, So, I will share what I have learned for all of you! Sometime It’s code for Python