[英]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秒就足以只執行一次打印。
當然,您的實現還有其他選擇,但這都取決於上下文。 如果您不打算在<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.