簡介
從最簡單的例子看起:
import schedule
import time
def job():
print("I'm working...")
schedule.every(10).minutes.do(job)
schedule.every().hour.do(job)
schedule.every().day.at("10:30").do(job)
schedule.every(5).to(10).days.do(job)
schedule.every().monday.do(job)
schedule.every().wednesday.at("13:15").do(job)
while True:
schedule.run_pending()
time.sleep(1)
這是在pypi上面給出的示例。這個栗子簡單到我不需要怎麼解釋。而且,通過這個栗子,我們也可以知道,schedule其實就只是個定時器。在while True死循環中,schedule.run_pending()是保持schedule一直運行,去查詢上面那一堆的任務,在任務中,就可以設置不同的時間去運行。跟crontab是類似的。
參考官網:https://schedule.readthedocs.io/en/stable/
但是,如果是多個任務運行的話,實際上它們是按照順序從上往下挨個執行的。如果上面的任務比較複雜,會影響到下面任務的運行時間。比如我們這樣:
import datetime
import schedule
import time
def job1():
print("I'm working for job1")
time.sleep(2)
print("job1:", datetime.datetime.now())
def job2():
print("I'm working for job2")
time.sleep(2)
print("job2:", datetime.datetime.now())
def run():
schedule.every(10).seconds.do(job1)
schedule.every(10).seconds.do(job2)
while True:
schedule.run_pending()
time.sleep(1)
接下來你就會發現,兩個定時任務並不是10秒運行一次,而是12秒。是的。由於job1和job2本身的執行時間,導致任務延遲了。
其實解決方法也很簡單:用多線程/多進程。不要幼稚地問我“python中的多線程不是沒有用嗎?”這是兩碼事。開了一條線程,就把job獨立出去運行了,不會佔主進程的cpu時間,schedule並沒有花掉執行一個任務的時間,它的開銷只是開啓一條線程的時間,所以,下一次執行就變成了10秒後而不是12秒後。
import datetime
import schedule
import threading
import time
def job1():
print("I'm working for job1")
time.sleep(2)
print("job1:", datetime.datetime.now())
def job2():
print("I'm working for job2")
time.sleep(2)
print("job2:", datetime.datetime.now())
def job1_task():
threading.Thread(target=job1).start()
def job2_task():
threading.Thread(target=job2).start()
def run():
schedule.every(10).seconds.do(job1_task)
schedule.every(10).seconds.do(job2_task)
while True:
schedule.run_pending()
time.sleep(1)
附:
python代碼裏執行另一個.py文件
import os
os.system("python filename.py")