Python標准庫之sched模塊介紹


sched——通用時間調度器

  sched模塊實現了一個通用事件調度器,在調度器類使用一個延遲函數等待特定的時間,執行任務。同時支持多線程應用程序,在每個任務執行后會立刻調用延時函數,以確保其他線程也能執行。

 一、延遲運行事件

在一個延遲或規定時間之后執行事件,需要采用enter()方法,包含4個參數:

  • 間隔時間(具體值決定與delayfunc, 這里為秒)
  • 優先級(兩個事件在同一時間到達的情況)
  • 調用的函數
  • 函數參數

例子:

import sched
import time

#生成調度器
scheduler = sched.scheduler(time.time, time.sleep)


def print_event(name):
    print ('EVENT:', time.time(), name)

print ('START:', time.time())

#分別設置在執行后2秒、3秒之后執行調用函數
scheduler.enter(2, 1, print_event, ('first',))
scheduler.enter(3, 1, print_event, ('second',))

#運行調度器
scheduler.run()

輸出結果:

START: 1532050215.3737717
EVENT: 1532050217.3747234 first
EVENT: 1532050218.375626 second

二、重疊事件

  調用run()塊執行所有的事件。每個事件都在同一線程中運行,所以如果一個事件需要更長的時間,延遲事件將會有重疊。為了不丟失事件,延遲事件將會在之前事件運行完再被執行,但一些延遲事件可能會晚於原本計划的事件。

例子:

import sched
import time

scheduler = sched.scheduler(time.time, time.sleep)

def long_event(name):
    print('BEGIN EVENT :', time.time(), name)
    time.sleep(2)
    print('FINISH EVENT:', time.time(), name)

print('START:', time.time())
scheduler.enter(2, 1, long_event, ('first',))

#事件無法在設想的3秒后執行,將會順延執行
scheduler.enter(3, 1, long_event, ('second',))

scheduler.run()

輸出結果:

START: 1532051082.8237524
BEGIN EVENT : 1532051084.8392828 first
FINISH EVENT: 1532051086.8475456 first
BEGIN EVENT : 1532051086.8475456 second
FINISH EVENT: 1532051088.8557353 second

三、事件優先級

如果多個事件是同一時間執行,通過設置他們的優先級值,用於確定順序運行

例子:

import sched
import time

scheduler = sched.scheduler(time.time, time.sleep)

def print_event(name):
    print('EVENT:', time.time(), name)

now = time.time()
print('START:', now)
scheduler.enterabs(now+2, 2, print_event, ('first',))
scheduler.enterabs(now+2, 1, print_event, ('second',))

scheduler.run()

輸出結果:

START: 1532052567.6057265
EVENT: 1532052569.621258 second
EVENT: 1532052569.621258 first

四、取消事件

利用enter()和enterabs()返回一個引用事件用來取消它。

例子:

import sched
import threading
import time

scheduler = sched.scheduler(time.time, time.sleep)

#建立一個全局 線程計數器
counter = 0

def increment_counter(name):
    global counter
    print('EVENT:', time.time(), name)
    counter += 1
    print('NOW:', counter)

print('START:', time.time())
e1 = scheduler.enter(2, 1, increment_counter, ('E1',))
e2 = scheduler.enter(3, 1, increment_counter, ('E2',))

# 開始一個線程執行事件
t = threading.Thread(target=scheduler.run)
t.start()

# 在主線程,取消第一個預定事件
scheduler.cancel(e1)

# 等待線程調度程序完成運行
t.join()

輸出結果:

START: 1532053265.5280123
EVENT: 1532053268.528813 E2
NOW: 1

 

除了上面介紹的scheduler方法,還有一些其他方法:

scheduler.empty()
判斷隊列是否為空


scheduler.queue
只讀屬性,返回一個即將到達的事件列表(按到達事件排序),每個事件都是有 time 、 priority 、 action 、 argument 組成的 namedtuple 。

 

 

參考來源:https://pymotw.com/2/sched/index.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM