python定時(shí)執(zhí)行任務(wù) 輕量級(jí)
python 中有一個(gè)輕量級(jí)的定時(shí)任務(wù)調(diào)度的庫(kù):schedule。他可以完成每分鐘,每小時(shí),每天,周幾,特定日期的定時(shí)任務(wù)。因此十分方便我們執(zhí)行一些輕量級(jí)的定時(shí)任務(wù)。
代碼如下:
import schedule
import time
3 def job():
4 print("I'm working...")
5 schedule.every(10).minutes.do(job)
6 schedule.every().hour.do(job)
7 schedule.every().day.at("10:30").do(job)
8 schedule.every(5).to(10).days.do(job)
9 schedule.every().monday.do(job)
10 schedule.every().wednesday.at("13:15").do(job)
11 while True:
12 schedule.run_pending()
13 time.sleep(1)
上面的意思就是:
每隔十分鐘執(zhí)行一次任務(wù)
每隔一小時(shí)執(zhí)行一次任務(wù)
每天的 10:30 執(zhí)行一次任務(wù)
每隔 5 到 10 天執(zhí)行一次任務(wù)
每周一的這個(gè)時(shí)候執(zhí)行一次任務(wù)
每周三 13:15 執(zhí)行一次任務(wù)
run_pending:運(yùn)行所有可以運(yùn)行的任務(wù)
當(dāng)然,如果函數(shù)中帶有參數(shù)怎么辦呢?
很簡(jiǎn)單,如下所示:
1 import schedule
2 import time
3 def job(name):
4 print("her name is : ", name)
5 name = xiaona
6 schedule.every(10).minutes.do(job, name)
7 schedule.every().hour.do(job, name)
8 schedule.every().day.at("10:30").do(job, name)
9 schedule.every(5).to(10).days.do(job, name)
10 schedule.every().monday.do(job, name)
11 schedule.every().wednesday.at("13:15").do(job, name)
12 while True:
13 schedule.run_pending()
14 time.sleep(1)
???時(shí)間是24小時(shí)制,要按標(biāo)準(zhǔn)來(lái)寫(xiě),否則就會(huì)
![G`35F7G{2V`N[O9)9AHJO]E](https://img2020.cnblogs.com/blog/1957655/202005/1957655-20200506170848010-2127091735.png)
最后改為09:00就ok了
疑問(wèn)解答:
最近有人問(wèn)我 while True 之類(lèi)的是什么意思,很簡(jiǎn)單,如果你去掉 while True 這個(gè)死循環(huán)的話(huà),schedule.run_pending () 是沒(méi)有辦法持續(xù)運(yùn)行的,那么 schedule.run_pending () 是個(gè)什么東西呢 ——
schedule 其實(shí)就只是個(gè)定時(shí)器。在 while True 死循環(huán)中,schedule.run_pending () 是保持 schedule 一直運(yùn)行,去查詢(xún)上面那一堆的任務(wù),在任務(wù)中,就可以設(shè)置不同的時(shí)間去運(yùn)行。跟 linux 中設(shè)置 crontab 定時(shí)任務(wù)是類(lèi)似的。
所以,schedule 有一定的局限性,所以只能用來(lái)執(zhí)行一些小型的定時(shí)任務(wù),它的局限性在哪呢 ——
1. 需要定時(shí)運(yùn)行的函數(shù) job 不應(yīng)當(dāng)是死循環(huán)類(lèi)型的,也就是說(shuō),這個(gè)線(xiàn)程應(yīng)該有一個(gè)執(zhí)行完畢的出口。一是因?yàn)榫€(xiàn)程萬(wàn)一僵死,會(huì)是非常棘手的問(wèn)題;二是下一次定時(shí)任務(wù)還會(huì)開(kāi)啟一個(gè)新的線(xiàn)程,執(zhí)行次數(shù)多了就會(huì)演變成災(zāi)難。
2. 如果 schedule 的時(shí)間間隔設(shè)置得比 job 執(zhí)行的時(shí)間短,一樣會(huì)線(xiàn)程堆積形成災(zāi)難,也就是說(shuō),我 job 的執(zhí)行時(shí)間是 1 個(gè)小時(shí),但是我定時(shí)任務(wù)設(shè)置的是 5 分鐘一次,那就會(huì)一直堆積線(xiàn)程。
