Python循环运行指定时间秒数

76 投票
7 回答
193596 浏览
提问于 2025-04-18 10:49

我有一个循环,想让它持续运行15分钟。现在的代码是:

while True:
    #blah blah blah

(这个循环会一直运行,然后重新开始。我希望它能继续这样做,但在15分钟后退出循环)

谢谢!

7 个回答

3

对于使用 asyncio 的朋友们,有个简单的方法就是用 asyncio.wait_for()

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

await asyncio.wait_for(my_loop(), 10)
3

我在这里看到一个问题,想找一个更容易理解的时间循环,类似这样的:

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秒的时间,使用sleep方法对我来说一直效果不好)。所以如果你的任务需要500毫秒,而你请求的间隔是1秒,那么你会在以下时间点被调用:0秒、500毫秒、2秒、2.5秒、4秒,依此类推。其实可以通过在循环中测量时间来解决这个问题,而不是使用sleep() ...

4

在编程中,有时候我们会遇到一些问题,可能是因为代码写得不够好,或者是我们对某些概念理解得不够透彻。比如,有些人可能在使用某个工具或库的时候,发现它的功能和效果跟自己预期的不太一样。这种情况很常见,尤其是对于刚入门的编程小白来说。

在这种情况下,最重要的是要耐心,逐步分析问题的根源。可以尝试查阅相关的文档,看看有没有人遇到过类似的问题,或者在网上搜索一下,看看有没有解决方案。很多时候,社区里会有经验丰富的人分享他们的经验和解决办法。

另外,写代码的时候,保持代码的整洁和可读性也是非常重要的。这样不仅能帮助自己更好地理解代码,也能让别人更容易看懂你的代码。如果遇到困难,不妨把问题拆分成小部分,逐一解决,这样会更有效率。

总之,编程是一项需要不断学习和实践的技能,遇到问题时不要气馁,积极寻求帮助和解决方案,慢慢你就会变得越来越熟练。

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

如果我理解你的意思,你可以使用一个叫做 datetime.timedelta 的东西来实现这个功能 -

import datetime

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

试试这个:

import time

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

这个代码会运行15分钟,也就是15分钟乘以60秒,等于900秒。

函数 time.time 会返回从1970年1月1日到现在的时间,单位是秒。这个值是浮点数,所以你可以用它来计算小于一秒的时间。开始时,计算出的结束时间 t_end 是“现在的时间”加上15分钟。这个循环会一直运行,直到当前时间超过这个设定的结束时间。

撰写回答