时间作为无限循环的停止条件

时间:2013-06-27 20:15:30

标签: python

# run infinitly
while(True):

  done = False;

  while(not done):
    #Do Stuff
    #Main Program

    #stopping condition of inner while loop
    if datetime.datetime.now().minute == 10:
      done = True
       if datetime.datetime.now().minute == 10:
          time.sleep(60-datetime.datetime.now().second)

我无法弄清楚为什么这对我不起作用。整个脚本应该在无限循环上运行,然后内循环应该通过,直到每10分钟满足一次停止条件。

这是我的理解,也许我错了,使用datetime.datetime.now()。分钟就像我在if循环中所做的那样将每隔10分钟设置done = True,并且将结束循环并继续与脚本的其余部分...直到它意识到它在另一个无限循环中然后它应该从头开始。

我对此命令的工作方式感到困惑,或者我的代码有问题吗?或者甚至有更好的方法来做到这一点?该脚本将运行,但它不会以停止条件结束内部循环。

5 个答案:

答案 0 :(得分:4)

有多种方法可以做到这一点,但保持接近原始设计,我将内循环编码为:

while(not done):
    if datetime.datetime.now().minute % 10 == 0:
        done = True
    else:
        time.sleep(60-datetime.datetime.now().second)

(我假设你试图用第二个if睡觉,直到下一分钟,当你还没准备好退出循环时。)

答案 1 :(得分:1)

每隔十分钟分钟停止:1:10,2:10,3:10等。为了做到这一点,请使用以下内容:

import time

# in outer loop
inner_loop_start = time.time()

# in inner loop
    now = time.time()
    if now - inner_loop_start > 60*10:
        # done= True and all that jazz

答案 2 :(得分:1)

不要在不断地检查是否超过一小时的时间,只是做一些数学并适当地睡觉。时间通常是确定性的。

import datetime
import time

def seconds_till_10past():
    now = datetime.datetime.now()
    delta = now.replace(minute=10, second=0) - now
    return delta.seconds % 3600

while True:
    time.sleep(seconds_till_10past())
    print "Do something at 10 past the hour."

另外,不要将语句的参数括起来(例如while(True)),这是不好的形式。

答案 3 :(得分:1)

这并没有直接回答这个问题,但是如果你想要首先想要实现的是每隔10分钟运行一些python代码,你最好用cron来实现它。

我假设你到目前为止有一个脚本在启动时以某种方式启动。它主要由无限循环,主程序和等待直到下一执行时间组件组成。例如,如下所示:

""" my_first_daemon.py
    does something everytime the datetime minute part is fully divisible by ten
"""

while True:
    # do something at 00,10,20,30,40,50 (minutes) every hour
    print "Hello World!"
    # wait until the next execution time
    wait_until_next_ten_minute_time()

如果确实如此,我建议将脚本的主要部分移动到单独的脚本中。例如,如下所示:

""" my_first_cronjob.py
    is run by cron everytime the datetime minute part is fully divisible by ten
"""

# do something at 00,10,20,30,40,50 (minutes) every hour
print "Hello World!"

您继续并添加到您的crontab(使用命令crontab -e将条目添加到该用户的运行该脚本的crontab,同时查看manpage)。例如:

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  *     command to be executed

# example entry:
# (divide minute-star by 10 to get it run every 10 minutes) 
*/10 *  *  *  *     python /path/to/my_first_cronjob.py

在编辑之后,你应该注意到像 crontab这样的消息:安装新的crontab ,然后你就完成了。只需等待,看看它是否有效。

有些事情需要注意:

  • 脚本输出到stdout和stderr后会在终止后通过邮件发送给您。查看tail -f /var/mail/moooeeeep(指定您的用户名)。您还可以配置Thunderbird来获取这些邮件,以便更轻松地检查它们。
  • 相应的Wikipedia page是一个非常好的信息来源,可以提供更多详细信息。
  • 如果您需要在脚本的独立运行之间保留状态信息,请考虑使用配置文件来存储此状态信息,例如,使用pickleshelvesqlite,等等

答案 4 :(得分:-1)

从我上面的评论中扩展:

tic = datetime.datetime.now()

while True:

    # do stuff

    toc = datetime.datetime.now() - tic
    if toc.minute > 10:
        tic = datetime.datetime.now();
        time.sleep(60-datetime.datetime.now().second)

我删除了“done”变量,因为它传达了完成的含义。但是,通过阅读您的代码,实际上您似乎实际上正在暂停一个持续的过程。

希望这有帮助!