当前时间是特定的时候结束循环

时间:2013-06-28 16:19:33

标签: python

之前我曾问过类似的问题,但这次有点不同。对我来说,以下代码应该可行。

import datetime
# run infinitly
while(True):

  done = False

  while(not done):
    #
    #main program
    #


    #stopping condition
      if currenttime == '103000':
        done = True

  #continue with rest of program

然而,当它在上午10:30:00到达时,它不会继续执行其余的程序。

以下我知道的程序(在树莓派上):

import datetime
done = False
while not done:
    currenttime = datetime.datetime.now().strftime('%H%M%S')
    if currenttime != '103000':
        print currenttime
    if currenttime == '103000':
        done = True
print 'It is 10:30:00am, the program is done.'

我在第一个例子中做了什么,这对我来说是合乎逻辑的。有谁知道为什么它不会退出那个循环并继续其余的?

4 个答案:

答案 0 :(得分:3)

如果主程序需要很长时间才能运行,currenttime可能会从102958跳转到103005。因此,完全跳过103000

答案 1 :(得分:1)

也许您需要在检查之前设置当前时间?此外,if语句必须完全执行103000才能执行done = True

while(True):

  done = False

  while(not done):
    #
    #main program
    #

    # need to set current time
    currenttime = datetime.datetime.now().strftime('%H%M%S')

    #stopping condition (use >= instead of just ==)
      if currenttime >= '103000':
        done = True

  #continue with rest of program

答案 2 :(得分:1)

请注意,不能保证循环在每个可用秒中都有一次迭代。系统负载越多,循环跳过一秒的可能性就越大,这可能是终止标准。还存在可以跳过秒的情况,例如,由于时间同步或夏令时问题。

您可以在几秒钟内预先计算timedelta,然后再睡几秒钟,而不是繁忙的等待循环。

优点:

  • 您将节省计算机上其他进程可以使用的计算能力。
  • 它可能会延长硬件的使用寿命。
  • 这也会更节能。

示例:

import datetime
import time
def wait_until_datetime(target_datetime):
    td = target_datetime - datetime.datetime.now()
    seconds_to_sleep = td.total_seconds()
    if seconds_to_sleep > 0:
        time.sleep(seconds_to_sleep)

target_datetime = datetime.datetime(2025, 1, 1)
wait_until_datetime(target_datetime)
print "Happy New Year 2025!"

请注意,由于系统日期和时间设置的任意更改,这可能仍无法产生所需的行为。可能最好采用完全不同的策略来在特定时间执行特定命令。您是否考虑过使用cron作业实现所需的行为? (您可以向流程发送信号,从而发出信号以取消循环...)

答案 3 :(得分:0)

import datetime
done = False
while True:
    currenttime = datetime.datetime.now().strftime('%H%M%S')
    if currenttime >= '103000':
        break
    print currenttime
print 'It is 10:30:00am, the program is done.'

如果你不能使用break:

import datetime
done = False
while not done:
    currenttime = datetime.datetime.now().strftime('%H%M%S')
    if currenttime >= '103000':
        done = True
    else:
        print currenttime
print 'It is 10:30:00am, the program is done.'