2010-07-11 58 views
0

我正在編寫的腳本有時會向API發出請求,API要求請求限制爲每秒最多1次。限制對CGI腳本中API的請求速率

將我的API請求每秒限制爲1的最直接方法是什麼?

是否需要每次發出請求時將當前時間存儲在文件中?

回答

1

您可以爲CGI調用使用單獨的線程,並在每次迭代時使用調用循環調用的排隊機制。

15.3. time

time.sleep(秒) 掛起的秒的給定數量的執行。該參數可能是一個浮點數,以表示更準確的睡眠時間。實際的中止時間可能會少於要求的時間,因爲任何捕捉到的信號都會在執行該信號的捕捉程序後終止睡眠()。而且,由於系統中的其他活動的調度,中止時間可能比任意數量所要求的更長。

+0

如何將這個單獨的線程工作的?問題在於每次發出請求時都會啓動腳本,如何在請求之間保留某些內容? – Acorn 2010-07-11 12:08:27

+0

您需要持久性。正如你在問題中所說的那樣,要麼在文件中進行二級存儲,要麼使用IPC和單獨的進程來進行CGI調用。請注意前者中的邊緣案例:請求1可能會讀取時間,然後在請求1有時間寫入新時間戳之前請求2(您需要爲此設置文件鎖定),或者如果您有夏令時,則請求2當時間改變時可能會搞砸。 – Metalshark 2010-07-11 12:10:46

+0

我不希望有一個過程必須經常運行。如果每次發出請求時都存儲當前時間,那麼執行此操作的最有效方法是什麼?酸洗並保存到文件中,然後每次發出新的請求時打開文件?哦,對,只是看到你的編輯。是的,我認爲可能會出現併發症。 – Acorn 2010-07-11 12:15:02

0

一個可以使用一個希望速率限制,像這樣的格雷格Burek功能的rate-limiting python decorator

import time 

def RateLimited(maxPerSecond): 
    minInterval = 1.0/float(maxPerSecond) 
    def decorate(func): 
     lastTimeCalled = [0.0] 
     def rateLimitedFunction(*args,**kargs): 
      elapsed = time.clock() - lastTimeCalled[0] 
      leftToWait = minInterval - elapsed 
      if leftToWait>0: 
       time.sleep(leftToWait) 
      ret = func(*args,**kargs) 
      lastTimeCalled[0] = time.clock() 
      return ret 
     return rateLimitedFunction 
    return decorate 

@RateLimited(2) # 2 per second at most 
def PrintNumber(num): 
    print num 

if __name__ == "__main__": 
    print "This should print 1,2,3... at about 2 per second." 
    for i in range(1,100): 
     PrintNumber(i)