簡體   English   中英

將循環限制為每分鍾N次迭代

[英]Limit loop to N iterations per minute

有人可以給我一些幫助,將Python中的循環限制為每分鍾N次迭代。

可以說我有

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

我將如何進行時間檢查/睡眠以提供正確的流程。 我不擔心在等待時阻塞正在執行的線程/進程。

謝謝

應當注意,這不是“硬實時”代碼。 由於操作系統調度等原因,此功能會略有下降。 話雖如此,除非您知道您需要實時的數據,否則就足夠了。

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

這將是最合適的答案: 什么是好的速率限制算法?

我特別喜歡使用裝飾器的第二個答案!

使用itertools 配方中的 grouper ,結合時間檢查。

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 )

這在很大程度上取決於您在循環內執行的工作類型以及希望此機制工作的准確性。

ATM我可以提出兩種可能的方案:

  • 如果一個迭代大約需要一定的時間比你能用於計算從最初的幾個迭代的平均和“休眠” 1 - iterationTime之后。
  • 否則,您可以輪詢時間並重新計算每步(或幾步)的平均值。

取決於單循環執行時間的標准偏差,這兩種方案都可以很好地工作,但是如果執行時間變化很大,則兩者都不會。 另外,如果您想要均勻分布的循環周期,而不僅要保持平均值/分鍾,還必須分配sleep-s,並在每次迭代后進行一次。

我對Python不夠熟悉,因此不知道查詢時間會花費多少,以及其他與Python相關的特定問題可能會隨着睡眠而出現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM