2010-09-22 56 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的問題。