亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python周期任務(wù)神器之Schedule模塊使用詳解

 更新時間:2022年04月19日 11:34:26   作者:Python學(xué)習(xí)與數(shù)據(jù)挖掘  
這篇文章主要為大家詳細(xì)介紹了Python中的周期任務(wù)神器—Schedule模塊的安裝和初級、進(jìn)階使用方法,文中的示例代碼講解詳細(xì),需要的可以參考一下

如果你想在Linux服務(wù)器上周期性地執(zhí)行某個 Python 腳本,最出名的選擇應(yīng)該是 Crontab 腳本,但是 Crontab 具有以下缺點:

1.不方便執(zhí)行秒級的任務(wù)。

2.當(dāng)需要執(zhí)行的定時任務(wù)有上百個的時候,Crontab的管理就會特別不方便

另外一個選擇是 Celery,但是 Celery 的配置比較麻煩,如果你只是需要一個輕量級的調(diào)度工具,Celery 不會是一個好選擇。

在你想要使用一個輕量級的任務(wù)調(diào)度工具,而且希望它盡量簡單、容易使用、不需要外部依賴,最好能夠容納 Crontab 的所有基本功能,那么 Schedule 模塊是你的不二之選。

使用它來調(diào)度任務(wù)可能只需要幾行代碼,感受一下:

import schedule
import time

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

schedule.every(10).minutes.do(job)

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

上面的代碼表示每10分鐘執(zhí)行一次 job 函數(shù),非常簡單方便。你只需要引入 schedule 模塊,通過調(diào)用 scedule.every(時間數(shù)).時間類型.do(job) 發(fā)布周期任務(wù)。

發(fā)布后的周期任務(wù)需要用 run_pending 函數(shù)來檢測是否執(zhí)行,因此需要一個 While 循環(huán)不斷地輪詢這個函數(shù)。

下面具體講講Schedule模塊的安裝和初級、進(jìn)階使用方法。

1.準(zhǔn)備

請選擇以下任一種方式輸入命令安裝依賴:

1. Windows 環(huán)境 打開 Cmd (開始-運行-CMD)。

2. MacOS 環(huán)境 打開 Terminal (command+空格輸入Terminal)。

3. 如果你用的是 VSCode編輯器 或 Pycharm,可以直接使用界面下方的Terminal.

pip install schedule

2.基本使用

最基本的使用在文首已經(jīng)提到過,下面給大家展示更多的調(diào)度任務(wù)例子:

import schedule
import time

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

# 每十分鐘執(zhí)行任務(wù)
schedule.every(10).minutes.do(job)
# 每個小時執(zhí)行任務(wù)
schedule.every().hour.do(job)
# 每天的10:30執(zhí)行任務(wù)
schedule.every().day.at("10:30").do(job)
# 每個月執(zhí)行任務(wù)
schedule.every().monday.do(job)
# 每個星期三的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)

可以看到,從月到秒的配置,上面的例子都覆蓋到了。不過如果你想只運行一次任務(wù)的話,可以這么配:

import schedule
import time

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

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

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

參數(shù)傳遞

如果你有參數(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')

獲取目前所有的作業(yè)

如果你想獲取目前所有的作業(yè):

import schedule

def hello():
    print('Hello world')

schedule.every().second.do(hello)

all_jobs = schedule.get_jobs()

取消所有作業(yè)

如果某些機制觸發(fā)了,你需要立即清除當(dāng)前程序的所有作業(yè):

import schedule

def greet(name):
    print('Hello {}'.format(name))

schedule.every().second.do(greet)

schedule.clear()

標(biāo)簽功能

在設(shè)置作業(yè)的時候,為了后續(xù)方便管理作業(yè),你可以給作業(yè)打個標(biāo)簽,這樣你可以通過標(biāo)簽過濾獲取作業(yè)或取消作業(yè)。

import schedule

def greet(name):
    print('Hello {}'.format(name))

# .tag 打標(biāo)簽
schedule.every().day.do(greet, 'Andrea').tag('daily-tasks', 'friend')
schedule.every().hour.do(greet, 'John').tag('hourly-tasks', 'friend')
schedule.every().hour.do(greet, 'Monica').tag('hourly-tasks', 'customer')
schedule.every().day.do(greet, 'Derek').tag('daily-tasks', 'guest')

# get_jobs(標(biāo)簽):可以獲取所有該標(biāo)簽的任務(wù)
friends = schedule.get_jobs('friend')

# 取消所有 daily-tasks 標(biāo)簽的任務(wù)
schedule.clear('daily-tasks')

設(shè)定作業(yè)截止時間

如果你需要讓某個作業(yè)到某個時間截止,你可以通過這個方法:

import schedule
from datetime import datetime, timedelta, time

def job():
    print('Boo')

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

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

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

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

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

截止日期之后,該作業(yè)將無法運行。

立即運行所有作業(yè),而不管其安排如何

如果某個機制觸發(fā)了,你需要立即運行所有作業(yè),可以調(diào)用 schedule.run_all() :

import schedule

def job_1():
    print('Foo')

def job_2():
    print('Bar')

schedule.every().monday.at("12:40").do(job_1)
schedule.every().tuesday.at("16:40").do(job_2)

schedule.run_all()

# 立即運行所有作業(yè),每次作業(yè)間隔10秒
schedule.run_all(delay_seconds=10)

3.高級使用

裝飾器安排作業(yè)

如果你覺得設(shè)定作業(yè)這種形式太啰嗦了,也可以使用裝飾器模式:

from schedule import every, repeat, run_pending
import time

# 此裝飾器效果等同于 schedule.every(10).minutes.do(job)
@repeat(every(10).minutes)
def job():
    print("I am a scheduled job")

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

并行執(zhí)行

默認(rèn)情況下,Schedule 按順序執(zhí)行所有作業(yè)。其背后的原因是,很難找到讓每個人都高興的并行執(zhí)行模型。

不過你可以通過多線程的形式來運行每個作業(yè)以解決此限制:

import threading
import time
import schedule

def job1():
    print("I'm running on thread %s" % threading.current_thread())
def job2():
    print("I'm running on thread %s" % threading.current_thread())
def job3():
    print("I'm running on thread %s" % threading.current_thread())

def run_threaded(job_func):
    job_thread = threading.Thread(target=job_func)
    job_thread.start()

schedule.every(10).seconds.do(run_threaded, job1)
schedule.every(10).seconds.do(run_threaded, job2)
schedule.every(10).seconds.do(run_threaded, job3)

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

日志記錄

Schedule 模塊同時也支持 logging 日志記錄,這么使用:

import schedule
import logging

logging.basicConfig()
schedule_logger = logging.getLogger('schedule')
# 日志級別為DEBUG
schedule_logger.setLevel(level=logging.DEBUG)

def job():
    print("Hello, Logs")

schedule.every().second.do(job)

schedule.run_all()

schedule.clear()

效果如下:

DEBUG:schedule:Running *all* 1 jobs with 0s delay in between
DEBUG:schedule:Running job Job(interval=1, unit=seconds, do=job, args=(), kwargs={})
Hello, Logs
DEBUG:schedule:Deleting *all* jobs

異常處理

Schedule 不會自動捕捉異常,它遇到異常會直接拋出,這會導(dǎo)致一個嚴(yán)重的問題:后續(xù)所有的作業(yè)都會被中斷執(zhí)行,因此我們需要捕捉到這些異常。

你可以手動捕捉,但是某些你預(yù)料不到的情況需要程序進(jìn)行自動捕獲,加一個裝飾器就能做到了:

import functools

def catch_exceptions(cancel_on_failure=False):
    def catch_exceptions_decorator(job_func):
        @functools.wraps(job_func)
        def wrapper(*args, **kwargs):
            try:
                return job_func(*args, **kwargs)
            except:
                import traceback
                print(traceback.format_exc())
                if cancel_on_failure:
                    return schedule.CancelJob
        return wrapper
    return catch_exceptions_decorator

@catch_exceptions(cancel_on_failure=True)
def bad_task():
    return 1 / 0

schedule.every(5).minutes.do(bad_task)

這樣,bad_task 在執(zhí)行時遇到的任何錯誤,都會被 catch_exceptions 捕獲,這點在保證調(diào)度任務(wù)正常運轉(zhuǎn)的時候非常關(guān)鍵。

到此這篇關(guān)于Python周期任務(wù)神器之Schedule模塊使用詳解的文章就介紹到這了,更多相關(guān)Python Schedule模塊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • pygame實現(xiàn)五子棋游戲

    pygame實現(xiàn)五子棋游戲

    這篇文章主要為大家詳細(xì)介紹了pygame實現(xiàn)五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • jupyter notebook如何導(dǎo)出pdf并支持中文

    jupyter notebook如何導(dǎo)出pdf并支持中文

    這篇文章主要介紹了jupyter notebook如何導(dǎo)出pdf并支持中文問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • tensorflow實現(xiàn)測試時讀取任意指定的check point的網(wǎng)絡(luò)參數(shù)

    tensorflow實現(xiàn)測試時讀取任意指定的check point的網(wǎng)絡(luò)參數(shù)

    今天小編就為大家分享一篇tensorflow實現(xiàn)測試時讀取任意指定的check point的網(wǎng)絡(luò)參數(shù),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • python轉(zhuǎn)換字符串為摩爾斯電碼的方法

    python轉(zhuǎn)換字符串為摩爾斯電碼的方法

    這篇文章主要介紹了python轉(zhuǎn)換字符串為摩爾斯電碼的方法,涉及Python字符串及編碼操作的相關(guān)技巧,非常簡單實用,需要的朋友可以參考下
    2015-07-07
  • Python如何輸出百分比

    Python如何輸出百分比

    這篇文章主要介紹了Python 如何輸出百分比,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • python將字典列表導(dǎo)出為Excel文件的方法

    python將字典列表導(dǎo)出為Excel文件的方法

    這篇文章主要介紹了python將字典列表導(dǎo)出為Excel文件的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-09-09
  • Python中sklearn實現(xiàn)交叉驗證示例分析

    Python中sklearn實現(xiàn)交叉驗證示例分析

    這篇文章主要介紹了Python中sklearn實現(xiàn)交叉驗證,本文python的版本為3.8,各個版本之間函數(shù)名字略有不同,但是原理都是一樣的,集成開發(fā)環(huán)境使用的是Anaconda的Spyder,需要的朋友可以參考下
    2023-08-08
  • Python中利用Scipy包的SIFT方法進(jìn)行圖片識別的實例教程

    Python中利用Scipy包的SIFT方法進(jìn)行圖片識別的實例教程

    SIFT算法可以檢測圖片中的局部特征,算法原理相當(dāng)復(fù)雜...但是!Python強大的第三方包Scipy中帶有實現(xiàn)SIFT算法的SIFT方法,我們只要拿來用就可以了,下面就為大家?guī)鞵ython中利用Scipy包的SIFT方法進(jìn)行圖片識別的實例教程.
    2016-06-06
  • django 通過URL訪問上傳的文件方法

    django 通過URL訪問上傳的文件方法

    今天小編就為大家分享一篇django 通過URL訪問上傳的文件方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • Django部署到服務(wù)器后無法獲取到靜態(tài)元素 The requested resource was not found on this server(問題及解決方案)

    Django部署到服務(wù)器后無法獲取到靜態(tài)元素 The requested resource

    寫了一個Django項目,部署到云主機后,訪問發(fā)現(xiàn)圖片無法訪問,報錯The requested resource was not found on this server,下面給大家介紹Django部署到服務(wù)器后無法獲取到靜態(tài)元素The requested resource was not found on this server(問題及解決方案),需要的朋友可以參考下
    2024-02-02

最新評論