2017-02-14 26 views
3

以下是:Python的調度VS環+睡眠

蟒蛇章附表:

from time import time, sleep 
from sched import scheduler 

def daemon(local_handler): 
    print 'hi' 
    local_handler.enter(3, 1, daemon, (local_handler,)) 

if __name__ == '__main__': 
    handler = scheduler(time, sleep) 
    handler.enter(0, 1, daemon, (handler,)) 
    handler.run() 

蟒蛇環+睡眠:

from time import sleep 

while True: 
    print 'hello' 
    sleep(3) 

有什麼區別章附表之間循環+睡眠,並且當系統時間改變時調度將停止?

回答

2

兩者之間的區別在於,調度程序比循環+睡眠更加pythonic,原因有兩個:優雅性和模塊性。

長循環很容易變得難以閱讀,並需要更多的代碼寫入其中。但是,使用調度程序時,可以在延遲上調用特定函數,其中包含所有代碼。這使代碼更具可讀性,並允許將代碼移入類和模塊以在主循環中調用。

Python通過檢查本地系統知道當前時間是什麼。如果本地系統的時間發生了變化,那麼這會影響當前正在運行的程序或腳本。

0

因爲python sched使用系統時間進行下一次迭代。 睡眠使用cpu時鐘進行下一次迭代。

0

一個很大的區別是多任務之間的延遲是根據需要計算的。這意味着,你的循環將採取:

  • 時間,它需要print("hello")或做你需要做的
  • 花費的時間sleep(3)

任務而如果你在你的調度更改順序於:

local_handler.enter(3, 1, daemon, (local_handler,)) 
do_the_task 

你的下一個任務將在3秒後,或do_the_task後立即運行,如果它超過3花的時間秒。

所以這個決定真的歸結爲:你是否希望你的任務每X時間單位執行一次,或者執行之間有X個時間單位空間。

假設您使用典型的(time, sleep)參數,如果系統時間發生變化,您將在預計的時間量後執行下一個任務(sleep負責此操作,除非在此期間收到某些信號),但您的下一個計劃任務時間將會移動。我相信下一個執行時間不會是你通常所期望的。