将循环限制为每分钟N次迭代

时间:2010-09-22 21:46:05

标签: python

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

让我说我有

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

我如何进行时间检查/睡眠以提供正确的流量。我并不担心在等待时阻塞正在执行的线程/进程。

由于

4 个答案:

答案 0 :(得分:3)

应该注意的是,这不是“硬实时”代码。由于OS调度等原因,这将略微偏离。话虽这么说,除非你知道你需要硬实时,这应该足够了。

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

答案 1 :(得分:0)

使用grouper recipes中的itertools,并结合时间检查。

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 )

答案 2 :(得分:0)

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

ATM我可以提出两种可能的方案:

  • 如果一次迭代需要大约一段时间,那么你可以计算前几次迭代的平均值,然后计算1 - iterationTime的“睡眠”。
  • 否则,您可以轮询时间并重新计算每一步(或几步)的平均值。

根据单循环执行时间的标准偏差,两种方案都可以很好地工作,但如果执行时间变化很大,那么它们都不会。此外,如果你想要均匀分布的循环周期,不仅要保持平均值/分钟,你必须分配sleep-s并在每次迭代后执行一次。

我不熟悉Python,知道查询时间有多昂贵,以及其他特定于Python的问题可能会出现在睡眠中。

答案 3 :(得分:0)

这是最恰当的答案: What's a good rate limiting algorithm?

我特别喜欢使用装饰器的第二个答案!