2015-12-02 33 views
-1

我試圖在循環完成時發送文件,而在無限循環內。除了發送文件的觸發器之外,一切正常。我如何檢查午夜是否在循環中過去?Python日期翻轉

from datetime import date  

while(True): 

    stamp = date.today() 

    for site in siteList: 
     # Long series of url requests and data processing 

    check = date.today() 

    if stamp != check: # <--- This doesn't work I don't know why 
     # Send today's file 
+0

導入日期?那是什麼?你自己的模塊? date.today()返回什麼? – Ale

+0

完美檢查:你有沒有在無限循環內實例化'check'?你難道不知道它曾經是哪一天嗎? –

+0

woops你的權利它是datetime的日期,這是一個打字錯誤,它在代碼中是正確的。 – svalle

回答

0

就我所見,您的代碼應該可以工作。也許問題在別處。

您是否嘗試過打印stampcheck,以便您可以查看正在使用的值?

您的時區設置是否正確?

+0

時區是UTC,郵票用作時間戳並按預期輸出。即使在小時長循環後分配,始終檢查等於郵票。 – svalle

+0

當你打印'郵票'和'檢查'他們是一樣的嗎?他們是早日還是晚日?你是在分配後立即印刷它們,還是以後印刷它們? –

0

這是脆弱的,並會導致你的問題。如果你的處理實際上是跨越午夜的話,唯一的辦法就是開火。這是因爲您每個循環都會更新您的支票日期以及您的原始日期。

如果您對此承諾,請在之外設置戳的值,然後在您的if塊中更新它,以便您的發送文件功能將始終每天觸發一次。

但是,在一臺機器上啓動一個腳本,並在沒有監督的情況下長時間運行腳本,會導致心痛。您需要某種工作處理器 - 我要麼讓我的webapp的工作隊列觸發週期性任務,要麼是真的是外部工作,我讓我的Jenkins服務器運行它 - 無論是哪種情況,我都可以在某處查找並查看最後一次運行並收到通知如果出現問題。

+0

郵票是用來標記一個文件,檢查是看是否是時候發送該文件了。這適用於AWS實例,並具有與其關聯的警報。 – svalle

+0

正確 - 如果內部循環需要4個小時,您希望內部循環每次執行6次_different_值用於'stamp' ...但僅將其中一個發送給目標? –

0

如何檢查午夜是否在循環中通過?

您的代碼已經這樣做,如果你指的是內部循環:date.today()只返回日期,即除非一天內循環時結束; stampcheck總是相等的。

如果您的意思是外環,則在外環之外移動stamp = date.today(),並且僅在觸發器被執行時更新stamp,即如果stamp != check。順便說一句,你應該使用更好的名字,如last_datetoday。您最初可以設置last_date = None,以便在第一遍時觸發執行。

我希望它做的事情,每天一次內部循環結束

from datetime import date 

last_date = None 
while True: # outer loop 
    for site in siteList: # inner loop 
     "hours long computations here" 
    today = date.today() 
    if last_date is None or last_date < today: 
     last_date = today # jobs are executed on different days 
     "send today's file here" 

一般來說之後,它更靈活的分離,它調度從代碼中的任務定義代碼任務本身,例如,你可以創建一個cron作業,每天運行一次。您可以使用鎖,等待內部循環完成並避免並行運行多個作業(cron doesn't protect against it)。如果以前的工作超過一天,兩個工作可能會在同一天發生。