執行周期性任務
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號任務執行。