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>time.time():
,不需要if time.time()>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 类型表示一定的秒数(分钟)