2010-09-22 54 views
0

有人请给我一些帮助,将Python的每分钟循环限制为N次迭代。将循环限制为每分钟N次迭代

可以说我有

limit = 5 
for items in recvData: 
    # > limit iterations in past minute? -> sleep for 60 seconds from last iterations before proceeding? # 
    ... do work ... 

我会怎么做的时候检查/就寝​​给予正确的流量。我并不担心在等待时阻塞正在执行的线程/进程。

感谢

+0

你打算在循环中做什么类型的工作? – pszilard 2010-09-22 22:26:22

回答

3

应该指出,这不是“硬实时”的代码。由于操作系统调度等原因,这将稍微关闭。这就是说,除非你知道你需要实时,否则这应该就足够了。

import time 

limit = 5 
starttime = time.time() 
for i, item in enumerate(recvData): 
    if not i + 1 % limit: 
     sleeptime =starttime + 60 - time.time() 
     if sleeptime > 0: 
      time.sleep(sleeptime) 
     starttime = time.time() 
    #processing code 
+0

谢谢,但如果我在处理代码下放置一个'打印项目',那么整个数组将在那里打印出来,而不是打印5,然后等待60秒后再继续。 – Jason 2010-09-22 22:11:25

+0

@Jason。你没有说你想分组打印它们。这将按照您的要求逐个处理它们。当你打印出列表时,_of course_整个数组被打印出来。 – aaronasterling 2010-09-22 22:12:10

+0

@AaronMcSmooth:为此,你需要一个正确的估计'limit' s.t. 'limit * iterationTime <= 1 min' *和*在整个执行过程中必须为真。 – pszilard 2010-09-22 22:15:01

0

使用grouperitertoolsrecipes,有时间检查相结合。

import itertools, datetime, time 
limit = 5 

def grouper(n, iterable, fillvalue=None): 
    "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx" 
    args = [iter(iterable)] * n 
    return itertools.izip_longest(fillvalue=fillvalue, *args) 

for items in grouper(limit, recvData): 
    prev_minute = datetime.datetime.now().minute 

    for item in items: 
     # do stuff 

    _, _, _, _, minute, second, _ = datetime.datetime.now() 
    if minute == prev_minute: 
     time.sleep(60 - second) 
+0

谢谢,这将失败:TypeError:'datetime.datetime'对象不可迭代 – Jason 2010-09-22 22:09:47

+0

与AaronMcSmooth相同,您需要知道'limit',并且知道它非常好:) – pszilard 2010-09-22 22:18:13

+0

@pszilard。 katrialex采取了与我相同的方式,并在开始时执行所有五项操作,然后_计算剩余的睡眠时间。 – aaronasterling 2010-09-22 22:28:42

0

这很大程度上取决于您在循环内所做的工作类型以及您希望此机制工作的准确度。

ATM我可以拿出2种可能的方案:

  • 如果一个迭代大约需要一定的时间比你能为1 - iterationTime计算从最初的几个迭代的平均和“休眠”之后。
  • 否则,您可以轮询时间并重新计算每个步骤(或几个步骤)的平均值。

根据您的单循环执行时间的标准偏差,两种方案都可以很好地工作,但是如果执行时间非常不同,它们都不会。此外,如果你想要均匀分布的循环周期,不仅保持平均/分钟,你必须分配睡眠,并在每次迭代后进行一次。

我对Python不太了解,不知道查询时间有多昂贵,以及睡眠时可能弹出哪些其他特定于Python的问题。