Python腳本實(shí)現(xiàn)定時(shí)任務(wù)的最佳方法
前言
在日常工作中,常常需要周期性地執(zhí)行某些任務(wù),常用的方式是采用 Linux 系統(tǒng)自帶的 crond 結(jié)合命令行實(shí)現(xiàn),但最近卻遇到了一個(gè)讓人頭大的問(wèn)題。
問(wèn)題描述
一個(gè)包含cx_Oracle的python文件,直接在linux下使用python命令可以運(yùn)行,但是設(shè)置crontab定時(shí)任務(wù)會(huì)報(bào)錯(cuò)如下:
cx_Oracle.DatabaseError:
DPI-1047: 64-bit Oracle Client library cannot be loaded:
"libclntsh.so: cannot open shared object file: No such file or directory".
See https://oracle.github.io/odpi/doc/installation.html#linux for help
折騰半天,才找到問(wèn)題的根源,原來(lái)crontab進(jìn)程執(zhí)行shell腳本時(shí)不會(huì)自動(dòng)加載用戶目錄下的.profile文件,無(wú)法正常使用自定義的環(huán)境變量,所以就找不到oracle相關(guān)的庫(kù),報(bào)錯(cuò)了。。。
解決方案
直接使用Python腳本實(shí)現(xiàn)定時(shí)任務(wù),實(shí)現(xiàn)方式有很多:
- 利用while True: + sleep()實(shí)現(xiàn)定時(shí)任務(wù)
- 使用Timeloop庫(kù)運(yùn)行定時(shí)任務(wù)
- 利用threading.Timer實(shí)現(xiàn)定時(shí)任務(wù)
- 利用內(nèi)置模塊sched實(shí)現(xiàn)定時(shí)任務(wù)
- 利用調(diào)度模塊schedule實(shí)現(xiàn)定時(shí)任務(wù)
- 利用任務(wù)框架APScheduler實(shí)現(xiàn)定時(shí)任務(wù)
- 使用分布式消息系統(tǒng)Celery實(shí)現(xiàn)定時(shí)任務(wù)
- 使用數(shù)據(jù)流工具Apache Airflow實(shí)現(xiàn)定時(shí)任務(wù)
下面給大家展示一種任同學(xué)認(rèn)為最好用的實(shí)現(xiàn)方式:利用調(diào)度模塊schedule實(shí)現(xiàn)定時(shí)任務(wù)。
import schedule import time def job(): print("I'm working...") # 每十分鐘執(zhí)行任務(wù) schedule.every(10).minutes.do(job) # 每個(gè)小時(shí)執(zhí)行任務(wù) schedule.every().hour.do(job) # 每天的10:30執(zhí)行任務(wù) schedule.every().day.at("10:30").do(job) # 每個(gè)月執(zhí)行任務(wù) schedule.every().monday.do(job) # 每個(gè)星期三的13:15分執(zhí)行任務(wù) schedule.every().wednesday.at("13:15").do(job) # 每分鐘的第17秒執(zhí)行任務(wù) schedule.every().minute.at(":17").do(job) while True: schedule.run_pending() time.sleep(1)
可以看到,從月到秒的配置,上面的例子都覆蓋到了。
如果你想只運(yùn)行一次任務(wù)的話,可以這么配:
import schedule import time def job_that_executes_once(): # 此處編寫(xiě)的任務(wù)只會(huì)執(zhí)行一次... return schedule.CancelJob schedule.every().day.at('22:30').do(job_that_executes_once) while True: schedule.run_pending() time.sleep(1)
如果你有參數(shù)需要傳遞給作業(yè)去執(zhí)行,可以這么做:
import schedule def greet(name): print('Hello', name) # do() 將額外的參數(shù)傳遞給job函數(shù) schedule.every(2).seconds.do(greet, name='Alice') schedule.every(4).seconds.do(greet, name='Bob')
如果你需要讓某個(gè)定時(shí)任務(wù)到某個(gè)時(shí)間截止,可以這么做:
import schedule from datetime import datetime, timedelta, time def job(): print('Boo') # 每個(gè)小時(shí)運(yùn)行作業(yè),18:30后停止 schedule.every(1).hours.until("18:30").do(job) # 每個(gè)小時(shí)運(yùn)行作業(yè),2030-01-01 18:33 today schedule.every(1).hours.until("2030-01-01 18:33").do(job) # 每個(gè)小時(shí)運(yùn)行作業(yè),8個(gè)小時(shí)后停止 schedule.every(1).hours.until(timedelta(hours=8)).do(job) # 每個(gè)小時(shí)運(yùn)行作業(yè),11:32:42后停止 schedule.every(1).hours.until(time(11, 33, 42)).do(job) # 每個(gè)小時(shí)運(yùn)行作業(yè),2020-5-17 11:36:20后停止 schedule.every(1).hours.until(datetime(2020, 5, 17, 11, 36, 20)).do(job)
怎么樣?是不是特好用!
總結(jié)
到此這篇關(guān)于Python腳本實(shí)現(xiàn)定時(shí)任務(wù)的最佳方法的文章就介紹到這了,更多相關(guān)Python實(shí)現(xiàn)定時(shí)任務(wù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python訪問(wèn)類中docstring注釋的實(shí)現(xiàn)方法
這篇文章主要介紹了python訪問(wèn)類中docstring注釋的實(shí)現(xiàn)方法,涉及python類注釋的訪問(wèn)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-05-05Django1.9 加載通過(guò)ImageField上傳的圖片方法
今天小編就為大家分享一篇Django1.9 加載通過(guò)ImageField上傳的圖片方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05Python提取特定時(shí)間段內(nèi)數(shù)據(jù)的方法實(shí)例
今天小編就為大家分享一篇關(guān)于Python提取特定時(shí)間段內(nèi)數(shù)據(jù)的方法實(shí)例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-04-04利用Python實(shí)現(xiàn)去重聚合Excel數(shù)據(jù)并對(duì)比兩份數(shù)據(jù)的差異
在數(shù)據(jù)處理過(guò)程中,常常需要將多個(gè)數(shù)據(jù)表進(jìn)行合并,并進(jìn)行比對(duì),以便找出數(shù)據(jù)的差異和共同之處,本文將介紹如何使用 Pandas 庫(kù)對(duì)兩個(gè) Excel 數(shù)據(jù)表進(jìn)行合并與比對(duì),需要的可以參考下2023-11-11Python實(shí)現(xiàn)視頻分解成圖片+圖片合成視頻
這篇文章主要介紹了如何利用Python實(shí)現(xiàn)視頻分解成圖片以及將圖片合成為視頻,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-04-04Python數(shù)據(jù)可視化:箱線圖多種庫(kù)畫(huà)法
這篇文章主要介紹了Python數(shù)據(jù)可視化箱線圖多種庫(kù)畫(huà)法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-11-11pandas通過(guò)字典生成dataframe的方法步驟
這篇文章主要介紹了pandas通過(guò)字典生成dataframe的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07python使用json序列化datetime類型實(shí)例解析
這篇文章主要介紹了python使用json序列化datetime類型實(shí)例解析,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02