日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python中的轻量级定时任务调度库:schedule

發布時間:2024/9/20 python 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python中的轻量级定时任务调度库:schedule 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

提到定時任務調度的時候,相信很多人會想到celery,要么就寫個腳本塞到crontab中。不過,一個小的定時腳本,要用celery的話太“重”了。所以,我找到了一個輕量級的定時任務調度的庫:schedule。
任務調度,輕量級的定時任務調度的庫:schedule。
庫的安裝還是最簡單的pip install schedule,使用起來也是很容易理解的。

1. 基本使用

mport schedule import timedef job():print("I'm working...")def job2(): print("I'm working... in job2")#schedule.every(10).minutes.do(job) # 每10分鐘執行一次job函數 #schedule.every(10).seconds.do(job) # 每10秒執行一次job函數 #schedule.every().hour.do(job) # 當every()沒參數時默認是1小時/分鐘/秒執行一次job函數 schedule.every().day.at("15:29").do(job) # 在每天10:30執行job函數 #schedule.every(5).to(10).days.do(job) #schedule.every(5).to(10).seconds.do(job) # 每隔5秒和10秒執行job工作 #schedule.every().monday.do(job) # 每周一執行 #schedule.every().wednesday.at("13:15").do(job) # 具體某一天某個時刻執行一次job函數 #schedule.every(10).seconds.do(job2) # 可以同時定時執行多個任務,但是每個任務是按順序執行i=0 while True:i=i+1schedule.run_pending()time.sleep(1)print(i)

運行:

... 44 45 46 47 48 49 50 51 52 53 I'm working... 54 55 56 ...

"15:29"是我自己定的,可以看到定點運行了。
通過這個栗子,我們也可以知道,schedule其實就只是個定時器。在while True死循環中,schedule.run_pending()是保持schedule一直運行,去查詢上面那一堆的任務,在任務中,就可以設置不同的時間去運行。跟crontab是類似的。

2. 多任務運行

但是,如果是多個任務運行的話,實際上它們是按照順序從上往下挨個執行的。如果上面的任務比較復雜,會影響到下面任務的運行時間。比如我們這樣:

import datetime import schedule import timedef 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)run()

運行:

I'm working for job1 job1: 2018-11-23 15:38:19.917520 I'm working for job2 job2: 2018-11-23 15:38:21.919624 I'm working for job1 job1: 2018-11-23 15:38:31.944652 I'm working for job2 job2: 2018-11-23 15:38:34.954488 I'm working for job1 job1: 2018-11-23 15:38:43.980233 I'm working for job2 job2: 2018-11-23 15:38:46.986861 I'm working for job1 job1: 2018-11-23 15:38:56.008891 I'm working for job2 job2: 2018-11-23 15:38:59.013363 I'm working for job1 job1: 2018-11-23 15:39:08.032680 I'm working for job2 job2: 2018-11-23 15:39:11.034983

接下來你就會發現,兩個定時任務并不是10秒運行一次,而是12秒。是的。由于job1和job2本身的執行時間,導致任務延遲了。

其實解決方法也很簡單:用多線程/多進程。開了一條線程,就把job獨立出去運行了,不會占主進程的cpu時間,schedule并沒有花掉執行一個任務的時間,它的開銷只是開啟一條線程的時間,所以,下一次執行就變成了10秒后而不是12秒后。

import datetime import schedule import threading import timedef 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)run()

這里運行感覺還是有點問題的。。

注意:唯一要注意的是,這里面job不應當是死循環類型的,也就是說,這個線程應該有一個執行完畢的出口。一是因為線程萬一僵死,會是非常棘手的問題;二是下一次定時任務還會開啟一個新的線程,執行次數多了就會演變成災難。如果schedule的時間間隔設置得比job執行的時間短,一樣會線程堆積形成災難,所以,還是需要注意一下的。

另一個例子:

import datetime import schedule import timedef 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().day.at("22:19").do(job1)schedule.every().day.at("22:19").do(job2)#schedule.every(3).seconds.do(job1)#schedule.every(3).seconds.do(job2)while True:schedule.run_pending()time.sleep(1)if __name__ == "__main__":run()

又一個多線程的例子:

import datetime import schedule import threading import timedef 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().day.at("22:23").do(job1_task)schedule.every().day.at("22:23").do(job2_task)#schedule.every(3).seconds.do(job1_task)#schedule.every(3).seconds.do(job2_task)while True:schedule.run_pending()time.sleep(1)if __name__ == "__main__":run()

轉發:https://www.cnblogs.com/wanglinjie/p/9286323.html

總結

以上是生活随笔為你收集整理的python中的轻量级定时任务调度库:schedule的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。