Python定時(shí)任務(wù)最全解決方案

<p>昨晚凌晨?jī)牲c(diǎn),小編接到女神的電話,心里正心猿意馬,沒(méi)想到電話中的女神竟帶著哭腔和我說(shuō)老板讓她現(xiàn)在就去公司加班,我很好奇的問(wèn)她什么事情要這么晚去?女神委屈的說(shuō):“因?yàn)槲覀児具@個(gè)產(chǎn)品是針對(duì)美國(guó)用戶,存在時(shí)差”說(shuō)完又哭了起來(lái)。唉,小編心想終于有機(jī)會(huì)在女神面前露一手了,聽(tīng)我慢慢道來(lái)。</p><p>在開發(fā)一個(gè)自動(dòng)化測(cè)試平臺(tái),其中有一個(gè)功能是必不可少的,那就是定時(shí)任務(wù)調(diào)度。比如現(xiàn)在你的項(xiàng)目需要凌晨2點(diǎn)跑測(cè)試,你一個(gè)女孩子不可能真的2點(diǎn)鐘起床跑到公司去執(zhí)行測(cè)試吧,這時(shí)候定時(shí)任務(wù)就顯得尤為重要,可以說(shuō)是作為一個(gè)測(cè)試平臺(tái)的標(biāo)配了
</p><p>用 Python定時(shí)任務(wù)實(shí)現(xiàn)的技術(shù)手段有很多,現(xiàn)在市面上主流的方式有四種。簡(jiǎn)單做個(gè)羅列說(shuō)明:
</p><ol><li><p>Linux系統(tǒng)級(jí)別的?crontab。</p></li><li><p>Python的?schedule庫(kù)。</p></li><li><p>Celery定時(shí)任務(wù)。</p></li><li><p>Python的?APScheduler庫(kù)。</p></li></ol><p>以上四種方式都可以實(shí)現(xiàn)定時(shí)任務(wù),我對(duì)這四種實(shí)現(xiàn)定時(shí)任務(wù)的技術(shù)都進(jìn)行了研究。這里給大家嘮嘮該如何選擇。</p><h2>一、?Linux系統(tǒng)的?crontab:</h2><p>Linux系統(tǒng)的 crontab非常好用,固定的間隔時(shí)間執(zhí)行指定的系統(tǒng)指令或 shell script腳本。時(shí)間間隔的單位可以是分鐘、小時(shí)、日、月、周及以上的任意組合。這個(gè)命令非常適合周期性的日志分析或數(shù)據(jù)備份等工作。但是他有個(gè)不好的是,如果我們項(xiàng)目比較復(fù)雜,涉及多臺(tái)服務(wù)器,那么一旦需要修改某個(gè)任務(wù)調(diào)度的策略,將變得非常麻煩。所以用一句話總結(jié) crontab就是:crontab雖好,可不要貪服務(wù)器哦~</p><h2>二、?Python的?schedule庫(kù):</h2><p>schedule庫(kù)是一個(gè)輕量級(jí)的定時(shí)任務(wù)方案。優(yōu)勢(shì)是使用簡(jiǎn)單,可以直接上手,基本不需要做什么配置。缺點(diǎn)是,因?yàn)楸容^輕量,導(dǎo)致他的功能比較局限,比如無(wú)法動(dòng)態(tài)的添加任務(wù),無(wú)法將任務(wù)的結(jié)果進(jìn)行持久化等。這里做個(gè)簡(jiǎn)單介紹:</p><h3>1. 安裝:</h3><ol><li><p><img src="https://upload-images.jianshu.io/upload_images/6620012-4e054d04c4edfad2.png" class="uploaded-img" width="auto" height="auto">
</p></li></ol><h3>2. 基本使用:</h3><ol><li><p><img src="https://upload-images.jianshu.io/upload_images/6620012-929093b32a30d09e.png" class="uploaded-img" width="auto" height="auto"><img src="https://upload-images.jianshu.io/upload_images/6620012-a608f71de2cba3c5.png" class="uploaded-img" width="auto" height="auto">
</p></li></ol><p>通過(guò)閱讀代碼,可以發(fā)現(xiàn) schedule用起來(lái)是非常簡(jiǎn)單和方便的,對(duì)于不需要?jiǎng)討B(tài)添加任務(wù),不需要存儲(chǔ)任務(wù)等的定時(shí)任務(wù),直接用 schedule來(lái)實(shí)現(xiàn)。簡(jiǎn)單,高效!</p><h2>三、?Celery庫(kù):</h2><p>Celery在異步任務(wù)和定時(shí)任務(wù)兩個(gè)方面可以說(shuō)是非常出名。他性能穩(wěn)定,功能強(qiáng)大,在中大型項(xiàng)目中扮演著重要的角色。但是 Celery也無(wú)法動(dòng)態(tài)的添加任務(wù)( Django中有相應(yīng)的插件可以實(shí)現(xiàn)動(dòng)態(tài)任務(wù)),而且對(duì)于之前沒(méi)有使用過(guò) Celery的項(xiàng)目,單獨(dú)因?yàn)槎〞r(shí)任務(wù)而搭建一套 Celery系統(tǒng)顯得會(huì)有點(diǎn)大材小用的感覺(jué),因?yàn)榇罱?Celery還得配一個(gè) Broker, Broker一般是 Redis或者 RabbitMQ,所以比較重量級(jí),也比較浪費(fèi)資源。</p><h3>1. 安裝:</h3><ol><li><p><img src="https://upload-images.jianshu.io/upload_images/6620012-9fb10ff38102d6be.png" class="uploaded-img" width="auto" height="auto">
</p></li></ol><h3>2. 簡(jiǎn)單實(shí)用:</h3><p>這里簡(jiǎn)單的來(lái)看看用 Celery是如何添加定時(shí)任務(wù)的:</p><ol><li><p><img src="https://upload-images.jianshu.io/upload_images/6620012-91e8597cc909fe79.png" class="uploaded-img" width="auto" height="auto">
</p></li></ol><p>要執(zhí)行 celery的定時(shí)任務(wù),我們需要打開兩個(gè)終端,一個(gè)用來(lái)監(jiān)聽(tīng)定時(shí)任務(wù),一個(gè)用來(lái)執(zhí)行定時(shí)任務(wù)。命令分別如下:</p><ol><li><p><img src="https://upload-images.jianshu.io/upload_images/6620012-01e10693f21b8f36.png" class="uploaded-img" width="auto" height="auto">
</p></li></ol><h2>四、?APScheduler庫(kù):</h2><p>APScheduler庫(kù)個(gè)人來(lái)說(shuō)是比較好用的,他不僅使用簡(jiǎn)單,功能還比較強(qiáng)大,比如支持動(dòng)態(tài)添加和刪除任務(wù),支持持久化,持久化的方式還有很多選擇,比如 內(nèi)存、 MongoDB、 SQLAlchemy、 Redis等,也針對(duì)一些常用的框架做了接口,比如有asyncio調(diào)度器、 gevent調(diào)度器等。接下來(lái)我們來(lái)嘮嘮。</p><h3>1. 安裝:</h3><ol><li><p><img src="https://upload-images.jianshu.io/upload_images/6620012-1d31a0facdee72f7.png" class="uploaded-img" width="auto" height="auto">
</p></li></ol><h3>2. 簡(jiǎn)單實(shí)用:</h3><p>這里我們用默認(rèn)的調(diào)度器 BlockingScheduler來(lái)做一個(gè)定時(shí)任務(wù):</p><ol><li><p><img src="https://upload-images.jianshu.io/upload_images/6620012-faf02002dfd53fae.png" class="uploaded-img" width="auto" height="auto"><img src="https://upload-images.jianshu.io/upload_images/6620012-7ea7537d7923ad6d.png" class="uploaded-img" width="auto" height="auto">
</p></li></ol><p>可以看到,任務(wù)實(shí)用起來(lái)非常的簡(jiǎn)單,他有 schduler.add_job函數(shù),可以動(dòng)態(tài)的添加任務(wù),操作起來(lái)非常的方便。另外還有 BackgroundScheduler、 AsyncIOScheduler等。</p><p>聽(tīng)我說(shuō)完,女神終于破涕為笑,嬌嗔著一直夸我好有才,哈哈,還好我自動(dòng)化測(cè)試學(xué)得好,總算離女神又近了一步!!</p><p>小編真是情場(chǎng)事業(yè)雙得意,學(xué)好自動(dòng)化,讓你們也能輕松搞定女神!</p><p>定時(shí)任務(wù)很常用,因此選好解決方案尤其重要。今天因?yàn)槠邢?,只針?duì)幾個(gè)定時(shí)庫(kù)做個(gè)科普性的介紹,如果你想了解某個(gè)具體的庫(kù),可以在評(píng)論區(qū)留言,我可以針對(duì)某個(gè)庫(kù)展開來(lái)說(shuō)一說(shuō)。</p><p>另外,個(gè)人覺(jué)得, APScheduler是我比較滿意的方案,用起來(lái)簡(jiǎn)單,輕量級(jí),功能也很強(qiáng)大。所以我在我的測(cè)試平臺(tái)上,用的就是 APScheduler的方案來(lái)解決的。如果你也想學(xué)習(xí)<strong>API自動(dòng)化測(cè)試平臺(tái)</strong>開發(fā),歡迎花個(gè)1分鐘的時(shí)間了解下:</p><p><img src="https://upload-images.jianshu.io/upload_images/6620012-c8820e8d8d8ac60b.jpeg" class="uploaded-img" width="auto" height="auto"><img src="https://upload-images.jianshu.io/upload_images/6620012-2bb3f34a5b361f8b.jpeg" class="uploaded-img" width="auto" height="auto"></p>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容