首頁 > 軟體

Python指令碼實現定時任務的最佳方法

2022-05-19 19:01:29

前言

在日常工作中,常常需要週期性地執行某些任務,常用的方式是採用 Linux 系統自帶的 crond 結合命令列實現,但最近卻遇到了一個讓人頭大的問題。

問題描述

一個包含cx_Oracle的python檔案,直接在linux下使用python命令可以執行,但是設定crontab定時任務會報錯如下:

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

折騰半天,才找到問題的根源,原來crontab程序執行shell指令碼時不會自動載入使用者目錄下的.profile檔案,無法正常使用自定義的環境變數,所以就找不到oracle相關的庫,報錯了。。。

解決方案

直接使用Python指令碼實現定時任務,實現方式有很多:

  • 利用while True: + sleep()實現定時任務
  • 使用Timeloop庫執行定時任務
  • 利用threading.Timer實現定時任務
  • 利用內建模組sched實現定時任務
  • 利用排程模組schedule實現定時任務
  • 利用任務框架APScheduler實現定時任務
  • 使用分散式訊息系統Celery實現定時任務
  • 使用資料流工具Apache Airflow實現定時任務

下面給大家展示一種任同學認為最好用的實現方式:利用排程模組schedule實現定時任務。

import schedule
import time

def job():
    print("I'm working...")

# 每十分鐘執行任務
schedule.every(10).minutes.do(job)
# 每個小時執行任務
schedule.every().hour.do(job)
# 每天的10:30執行任務
schedule.every().day.at("10:30").do(job)
# 每個月執行任務
schedule.every().monday.do(job)
# 每個星期三的13:15分執行任務
schedule.every().wednesday.at("13:15").do(job)
# 每分鐘的第17秒執行任務
schedule.every().minute.at(":17").do(job)

while True:
    schedule.run_pending()
    time.sleep(1)

可以看到,從月到秒的設定,上面的例子都覆蓋到了。

如果你想只執行一次任務的話,可以這麼配:

import schedule
import time

def job_that_executes_once():
    # 此處編寫的任務只會執行一次...
    return schedule.CancelJob

schedule.every().day.at('22:30').do(job_that_executes_once)

while True:
    schedule.run_pending()
    time.sleep(1)

如果你有引數需要傳遞給作業去執行,可以這麼做:

import schedule

def greet(name):
    print('Hello', name)

# do() 將額外的引數傳遞給job函數
schedule.every(2).seconds.do(greet, name='Alice')
schedule.every(4).seconds.do(greet, name='Bob')

如果你需要讓某個定時任務到某個時間截止,可以這麼做:

import schedule
from datetime import datetime, timedelta, time

def job():
    print('Boo')

# 每個小時執行作業,18:30後停止
schedule.every(1).hours.until("18:30").do(job)

# 每個小時執行作業,2030-01-01 18:33 today
schedule.every(1).hours.until("2030-01-01 18:33").do(job)

# 每個小時執行作業,8個小時後停止
schedule.every(1).hours.until(timedelta(hours=8)).do(job)

# 每個小時執行作業,11:32:42後停止
schedule.every(1).hours.until(time(11, 33, 42)).do(job)

# 每個小時執行作業,2020-5-17 11:36:20後停止
schedule.every(1).hours.until(datetime(2020, 5, 17, 11, 36, 20)).do(job)

怎麼樣?是不是特好用!

總結

到此這篇關於Python指令碼實現定時任務的最佳方法的文章就介紹到這了,更多相關Python實現定時任務內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com