Python循环运行一定的秒数

Posted

技术标签:

【中文标题】Python循环运行一定的秒数【英文标题】:Python loop to run for certain amount of seconds 【发布时间】:2014-08-14 00:09:30 【问题描述】:

我有一个 while 循环,我希望它持续运行 15 分钟。目前是:

while True:
    #blah blah blah

(这会运行,然后重新启动。我需要它继续执行此操作,除非 15 分钟后退出循环)

谢谢!

【问题讨论】:

【参考方案1】:

对于那些使用 asyncio 的人,一个简单的方法是使用asyncio.wait_for()

async def my_loop():
    res = False
    while not res:
        res = await do_something()

await asyncio.wait_for(my_loop(), 10)

【讨论】:

【参考方案2】:

当我在这里遇到这个问题时,我正在寻找一个更易于阅读的时间循环。比如:

for sec in max_seconds(10):
      do_something()

所以我创建了这个助手:

# allow easy time-boxing: 'for sec in max_seconds(42): do_something()'
def max_seconds(max_seconds, *, interval=1):
    interval = int(interval)
    start_time = time.time()
    end_time = start_time + max_seconds
    yield 0
    while time.time() < end_time:
        if interval > 0:
            next_time = start_time
            while next_time < time.time():
                next_time += interval
            time.sleep(int(round(next_time - time.time())))
        yield int(round(time.time() - start_time))
        if int(round(time.time() + interval)) > int(round(end_time)): 
            return

它只适用于整秒,这对我的用例来说是可以的。

例子:

for sec in max_seconds(10) # -> 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
for sec in max_seconds(10, interval=3) # -> 0, 3, 6, 9
for sec in max_seconds(7): sleep(1.5) # -> 0, 2, 4, 6
for sec in max_seconds(8): sleep(1.5) # -> 0, 2, 4, 6, 8

请注意,间隔不是那么准确,因为我只等待整秒(睡眠时间小于 1 秒对我没有任何好处)。因此,如果您的工作需要 500 毫秒并且您要求 1 秒的间隔,您将在以下时间被调用:0、500 毫秒、2000 毫秒、2500 毫秒、4000 毫秒等等。可以通过在循环中测量时间而不是 sleep() 来解决这个问题 ...

【讨论】:

【参考方案3】:

你可以做到的

import time
delay=60*15    ###for 15 minutes delay 
close_time=time.time()+delay
while True:
      ##bla bla
      ###bla bla
     if time.time()>close_time
         break

【讨论】:

或者更简单的while close_time&gt;time.time():,不需要if time.time()&gt;close_time: break...【参考方案4】:

试试这个:

import time
import os

n = 0
for x in range(10): #enter your value here
    print(n)
    time.sleep(1) #to wait a second
    os.system('cls') #to clear previous number
                     #use ('clear') if you are using linux or mac!
    n = n + 1

【讨论】:

【参考方案5】:

如果我理解你,你可以用datetime.timedelta 来做 -

import datetime

endTime = datetime.datetime.now() + datetime.timedelta(minutes=15)
while True:
  if datetime.datetime.now() >= endTime:
    break
  # Blah
  # Blah

【讨论】:

谢谢它的工作,但我使用 DrV 的答案只是因为它对我更有意义。 @Elliott,你有什么理由不直接在 while 语句中使用 now() @Bob 配合 OP 的问题。【参考方案6】:

试试这个:

import time

t_end = time.time() + 60 * 15
while time.time() < t_end:
    # do whatever you do

这将运行 15 分钟 x 60 秒 = 900 秒。

函数time.time 返回自 1970 年 1 月 1 日以来的当前时间(以秒为单位)。该值是浮点数,因此您甚至可以以亚秒级精度使用它。一开始,t_end 的值被计算为“现在”+ 15 分钟。循环将一直运行,直到当前时间超过这个预设的结束时间。

【讨论】:

谢谢,我最初只用了 60 秒测试了它,但它停止了,所以我知道 15 分钟也可以。 另一个问题:下面的语法有效吗? if keys[pygame.K_LEFT]: answer = "left" f = open("answer.rtf", "a") f.write(answer) f.close() 之后它不会让我打开文本文件,我想知道是我做错了什么还是我的电脑出了问题。 从 SO cmets 中发现代码中的轻微语法错误非常困难,所以也许您应该创建另一个问题。但是,至少if操作是错误的,应该有==而不是=,冒号应该在“left”之后。如果您无法通过合理的努力使其工作,请发布另一个问题。 (只要确保你没有对缩进做错任何事情。) @oam811:在 Python 3 上使用 time.monotonic(),以避免由于机器时钟调整导致的意外延迟(time.time() 可以设置回)。 如果由于时间限制而必须跳过循环,有没有办法让它通知我?

以上是关于Python循环运行一定的秒数的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中使用 unsigned long long int 类型表示一定的秒数(分钟)

在 Python 中确定两个日期之间的秒数

如何在Python中获取自特定时间以来的秒数

如何获得自 1970 年 1 月 1 日以来 Python 日期时间对象的秒数?

将时间四舍五入到最接近的秒数 - Python

Pandas - Python 2.7:如何将时间序列索引转换为一天中的秒数?