定時函數

有阻塞任務sched,從run開始後阻塞,此時會判斷delay時間時候到達或者超過了就當即執行,若是到了就執行若是沒到就等待知道執行,若是python

#!usr/bin/env python
# -*- coding: utf-8 -*-
import time
import sched

# 第一個工做函數
# 第二個參數 @starttime 表示任務開始的時間
# 很明顯參數在創建這個任務的時候就已經傳遞過去了,至於任務什麼時候開始執行就由調度器決定了
def worker(msg, starttime):
    print u"任務執行的時刻", time.time(), "傳達的消息是", msg, '任務創建時刻', starttime


# 建立一個調度器示例
# 第一參數是獲取時間的函數,第二個參數是延時函數
# print u'----------  兩個簡單的例子  -------------'
# print u'程序啓動時刻:', time.time()
s = sched.scheduler(time.time, time.sleep)
# s.enter(1, 1, worker, ('hello', time.time()))
# s.enter(3, 1, worker, ('world', time.time()))
# s.run()  # 這一個 s.run() 啓動上面的兩個任務
# print u'睡眠2秒前時刻:', time.time()
# time.sleep(2)
# print u'睡眠2秒結束時刻:', time.time()
#

# 重點關注下面2個任務,創建時間,啓動時間
# 2個任務的創建時間都很好計算,但有沒有發現 "hello world [3]" 的啓動時間比創建時間晚 13 秒,
# 這不就是2個 sleep 的總延時嗎?因此說啓動時間並不必定就是 delay 能指定的,還須要看具體的程序環境,
# 若是程序堵塞的很厲害,已經浪費了一大段的時間尚未到 scheduler 能調度這個任務,當 scheduler 能調度這個
# 任務的時候,發現 delay 已通過去了, scheduler 爲了彌補「罪過」,會立刻啓動這個任務。

# 任務 "hello world [15]" 就是一個很好的例子,正常狀況下,程序沒有阻塞的那麼厲害,在scheduler 能調度這個任務的時候
# 發現 delay 還沒到就等待,若是 delay 時間到了就能夠在剛好指定的延時調用這個任務。
print u'\n\n----------  兩個複雜的例子  -------------'
s.enter(3, 1, worker, ('hello world [3]', time.time()))
print u'睡眠7秒前時刻:', time.time()
time.sleep(7)
print u'睡眠7秒結束時刻:', time.time()


s.enter(15, 1, worker, ('hello world [15]', time.time()))
print u'睡眠6秒前時刻:', time.time()
time.sleep(6)
print u'睡眠6秒結束時刻:', time.time()

s.run() # 過了2秒以後,啓動另一個任務
#
#
# print u'程序結束時刻', time.time()
sched

無阻塞的timmer()異步

#!usr/bin/env python
# -*- coding: utf-8 -*-

# 異步執行任務
import sched
from threading import Timer
import time


def func(msg, starttime):
    print u'程序啓動時刻:', starttime, '當前時刻:', time.time(), '消息內容 --> %s' % (msg)

s = sched.scheduler(time.time, time.sleep)
# 下面的兩個語句和上面的 scheduler 效果同樣的
Timer(5, func, ('hello', time.time())).start()
s.enter(5,1,func,('sssss', time.time()))

print '10秒前',time.time()
time.sleep(10)
print '10秒後',time.time()

Timer(3, func, ('world', time.time())).start()
View Code
相關文章
相關標籤/搜索