在Python中如何重复执行某个操作x分钟?

5
我有一个程序(temptrack),需要每隔x分钟下载x小时的天气数据。我已经弄清楚了如何使用time.sleep(x*60)每隔x分钟下载一次,但我不知道如何在特定的小时数内重复此过程。
更新: 感谢所有发布解决方案的人。 我标记了使用“datetime.datetime.now() + datetime.timedelta(hours=x)”的示例作为最佳答案,因为我能理解它,并且似乎非常适合我的目的。
5个回答

5

计算您想停止做任何事情的时间,并检查每次时间限制是否已过期。像这样:

finish_time = datetime.datetime.now() + datetime.timedelta(hours=6)
while datetime.datetime.now() < finish_time:
    do_something()
    sleep_for_a_bit()

这正是我一直在寻找的,尽管我不知道它。非常感谢。 - ErikT

4

我刚刚在Python标准库中发现了sched


3
您正在寻找一款调度程序。
请查看此帖子

0

可能有些过度,但如果您需要运行后台任务,特别是需要GUI,则建议使用QSystemTrayIconQTimer来查看PyQt路线。


-2
也许我误解了你的意思,但只需将其放入循环中运行足够多次即可。例如,要每5分钟下载一次,持续2小时,您需要下载24次,因此代码如下:
```python import time for i in range(24): # 下载代码 time.sleep(300) # 等待5分钟 ```
希望对您有所帮助。
for i in range(24):
    download()
    sleep(5*60)

如果你需要使其可参数化,只需这样做:

from __future__ import division
from math import ceil
betweenDLs = 5 # minutes
totalTime = 2*60 # minutes
for i in range(int(ceil(totalTime/betweenDLs))):
    download()
    sleep(betweenDLs*60)

2
这是一个简单的解决方案,但如果执行函数的时间与执行之间的时间相似,则可能不完全符合要求。 - Mark Byers
谢谢。你的第一个例子很好用。我将只使用 "for i in range(totalTime/frequency)",这应该很好用。我知道它会四舍五入(因为我使用整数而不是浮点数),但它不必非常准确。 - ErikT
1
除非你需要一个真正的列表,否则请避免使用range()。如果你只需要运行一个for循环,请使用xrange。这将优化你的代码,因为range()会分配整个列表,而xrange()只是一个迭代器。注意:在Python3中只有range(),并且表现得像xrange()。 - Dacav
我会使用select()来完成这个任务 :p - dzen
更新:算了,使用“for i in range(totalTime/frequency)”似乎效果不太好(意味着它太不准确了,不能使用)。谢谢,我会查看xrange()和select()的。 - ErikT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接