簡體   English   中英

以干凈的方式在$ {sometime}安排代碼執行而又無需重新輸入的方式,怎么辦?

[英]Clean way to schedule execution of code at ${sometime} without reentry, how?

我是編寫Python代碼並嘗試在特定時間僅執行一次代碼的新手。 有點輪詢時間。

在這里我想在凌晨00:30執行。

while True:
    now = datetime.datetime.now()

    if now.hour == 0 and now.minute == 30:
        print "Hit"    # will use this line to call another function or code
        time.sleep(100)

    time.sleep(5)   # to avoid hogging up cpu

使用無限循環和sleep(100),100秒就足以只執行一次打印。

  • 在python中還有更健壯的方法嗎?

介紹

當然,您的實現還有其他選擇,但這都取決於上下文。 如果您不打算在<start of script><desired execution time>之間進行任何其他工作,則可以簡單地計算兩點之間的秒數,並在整個持續時間內保持睡眠狀態。

from datetime import datetime as dt, time as t
from time     import sleep
def work (): 
    pass
target = dt.combine (dt.now (), t (hour=10,minute=36,second=30))
secs   = (target - dt.now ()).total_seconds ()

必須意識到使用dt.now ()並按照上面的方式顯式設置時間,如果經過該時間,則可能導致以secs為單位的負數。



為了補償所提到的問題,我們需要確保計划的執行是在將來(如果我們必須等到明天,則將target有效地增加了一天):

import datetime as datetime_m
from   datetime import datetime as dt, time as t
from       time import sleep
...
target = dt.combine (dt.now (), t (hour=0,minute=30,second=0))

if (target < dt.now ()):
    target += datetime_m.timedelta(days=1)
...


循環運行

如果要循環運行此代碼,則只需在每次迭代中將target增加一天,而不必擔心觸發相同的工作兩次。

import datetime as datetime_m
from   datetime import datetime as dt, time as t
from       time import sleep

def work ():
    pass

target = dt.combine (dt.now (), t (hour=0,minute=30,second=0))

if (target < dt.now ()):
    target += datetime_m.timedelta (days=1)

while True:
    seconds_until_execution = (target - dt.now ()).total_seconds ()

    sleep (seconds_until_execution)         # wait
    work  ()                                # execute

    target += datetime_m.timedelta (days=1) # queue next

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM