2013-03-24 29 views
1

我似乎無法找到如何在Python中安排事件的簡單示例。使用python sched模塊和enterabs在特定時間運行一個函數

我希望能夠將一個日期和時間字符串作爲參數傳遞給一個函數。

例如:

字符串: 「M/d/Y HH:MM」 將設定的時間爲將來的功能來運行,所述代碼已被執行之後。所以,就像我運行後等待關閉的函數一樣。

看起來主要問題是正確格式化字符串,但一個簡單的例子真的有助於看到如何「安排」一個函數來運行。

回答

2

你沒有給出足夠的上下文來理解你想要在一個更大的框架中做什麼 - 但是,一般來說 - 在Python中「這不是它的工作原理」。

一個「普通」的Python程序是一個單線程的同步程序 - 它將一個接一個地執行一個任務,當一切完成時,程序退出,解釋器隨之退出。

所以,東西一起(同一個虛構的「時間表」功能):

def main(): 
    print("Hello World") 
    schedule(60, main) 

main() 

不會在Python的工作,如果呼叫調度會立即返回 - 主要功能將退出,並且該計劃將嘗試在main()呼叫後恢復,並終止。需要有一段代碼保持運行,它可以計算時間和延遲,也許可以接收網絡或用戶生成的事件,並將它們分派給先前安排的回調函數,以便程序繼續運行。

這樣一段代碼,可以說明時間和調度調用,通常稱爲「reactor」 - 並且沒有運行在純Python程序中。與JavaScript不同的是,在JavaScript程序中,瀏覽器或其他JavaScript環境默認提供這種託管。

這就是爲什麼大多數的Python Web或網絡框架,所有的GUI工具包,提供了這樣的核心 - 通常被稱爲在一個主要的腳本的結尾,是一個名爲mainloopserve_foreverstart等方法或函數。從那一刻起,你的主腳本已經設置了適當的回調,排定的東西等等,停止 - 反應堆將成爲調用事物的代碼段。

這就是我說你的問題沒有考慮到你想要做的事情的背景:起初你只是想測試一些調度 - 但事後你會想要在一個更大的系統內部 - 該系統應該使用撥出例如Django,龍捲風,金字塔,如果它是一個網絡服務器系統,gtk,Qt,Tk如果它是一個GUI程序,PyOgre,kivy,pyglet,如果它是一個多媒體程序,針對另一個協議的通用網絡服務器或者其他一些東西,如芹菜或camaelia,這些只是一般性示例。也就是說,Python的標準庫確實提供了一個「通用」的調度程序功能 - 它實現了這樣一個循環,只有功能的核心。如果你沒有做別的事情,也沒有什麼奇怪的東西,它會在那裏阻塞,直到它到達調用你的預定功能的時間,然後它將退出,並將控制權恢復到你的主程序。如果你的被調用函數安排了其他的東西,它會繼續運行,等等。

請閱讀文檔和示例: http://docs.python.org/2/library/sched.html

您可以使用函數從datetime模塊代替了time.time設置R絕對定時爲你詢問。另外請查看threading.Timer的文檔 - 如果你想在給定的延遲後運行一個簡單的函數,並行於任何其他代碼運行,那麼以天真的方式可以做更多或更少的事情,不想將應用程序重寫爲基於事件 - 但更簡單一些,因爲它可能會在更大的系統中存在許多缺點 - 您應該選擇列出的某個框架。

相關問題