python使用sched模塊執行周期性任務和定時任務


執行周期性任務

sched模塊是一個通用的事件調度程序,可以對任務進行延遲調度,基於此,可以用它來實現周期性任務。

# coding:utf8
import time
import sched


# 初始化scheduler類
# 第一個參數是一個可以返回時間戳的函數,第二個參數可以在定時未到達之前阻塞。
s = sched.scheduler(time.time, time.sleep)


# 被周期性調度的任務
def task():
    print("run time: {}".format(int(time.time())))


def perform(inc):
    s.enter(inc, 0, perform, (inc,))
    task()


def main(inc=3):
    s.enter(0, 0, perform, (inc,))
    s.run()


if __name__ == "__main__":
    main()

執行結果為:

>>> run time: 1558716699
>>> run time: 1558716702
>>> run time: 1558716705
>>> run time: 1558716708
>>> ......

任務每隔3s執行一次,周期性執行。

s.enter()方法用來加入調度事件,即將任務加入到隊列中,它有四個參數,分別為:間隔時間、優先級(為兩個被調度在相同時間執行的函數定序,數字越小,優先級越高)、被調用觸發的函數、函數的參數(參數放在元組中,當只有一個參數時,寫為(parm,))

s.run()用來執行隊列中的任務。

 

執行定時任務

當單純執行定時任務時,可以是這樣:

# coding:utf8
import time
import sched


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


def print_time(task_id):
    print("#{} run time: {}".format(task_id, int(time.time())))


def print_some_times():
    print(int(time.time()))
    s.enter(10, 1, print_time, (0,))
    s.enter(5, 2, print_time, (1,))
    s.enter(5, 1, print_time, (2,))
    s.run()
    print(int(time.time()))


if __name__ == "__main__":
    print_some_times()

執行結果為:

>>> 1558716127
>>> #2 run time: 1558716132
>>> #1 run time: 1558716132
>>> #0 run time: 1558716137
>>> 1558716137

可以看到,執行總耗時為10s,執行開始后5s,1號和2號任務同時到達執行時間,由於2號任務的優先級高先執行,后面1號任務執行,10s后,0號任務執行。

 


免責聲明!

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



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