干净的方式安排在$ {sometime}执行代码而不重新进入,如何?

时间:2015-10-08 08:12:50

标签: python

我是编写python代码并尝试在特定时间内只执行一次代码的新手。轮询时间排序。

这里我想在00:30 AM时执行。

div_cd

使用无限循环和睡眠(100),100秒就足以执行一次打印。

  • 在python中有没有更强大的方法来做到这一点?

1 个答案:

答案 0 :(得分:1)

简介

您的实现肯定有其他选择,但这完全取决于上下文。如果您不打算在 <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