我正在編寫的腳本有時會向API發出請求,API要求請求限制爲每秒最多1次。限制對CGI腳本中API的請求速率
將我的API請求每秒限制爲1的最直接方法是什麼?
是否需要每次發出請求時將當前時間存儲在文件中?
我正在編寫的腳本有時會向API發出請求,API要求請求限制爲每秒最多1次。限制對CGI腳本中API的請求速率
將我的API請求每秒限制爲1的最直接方法是什麼?
是否需要每次發出請求時將當前時間存儲在文件中?
您可以爲CGI調用使用單獨的線程,並在每次迭代時使用調用循環調用的排隊機制。
time.sleep(秒) 掛起的秒的給定數量的執行。該參數可能是一個浮點數,以表示更準確的睡眠時間。實際的中止時間可能會少於要求的時間,因爲任何捕捉到的信號都會在執行該信號的捕捉程序後終止睡眠()。而且,由於系統中的其他活動的調度,中止時間可能比任意數量所要求的更長。
一個可以使用一個希望速率限制,像這樣的格雷格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)
如何將這個單獨的線程工作的?問題在於每次發出請求時都會啓動腳本,如何在請求之間保留某些內容? – Acorn 2010-07-11 12:08:27
您需要持久性。正如你在問題中所說的那樣,要麼在文件中進行二級存儲,要麼使用IPC和單獨的進程來進行CGI調用。請注意前者中的邊緣案例:請求1可能會讀取時間,然後在請求1有時間寫入新時間戳之前請求2(您需要爲此設置文件鎖定),或者如果您有夏令時,則請求2當時間改變時可能會搞砸。 – Metalshark 2010-07-11 12:10:46
我不希望有一個過程必須經常運行。如果每次發出請求時都存儲當前時間,那麼執行此操作的最有效方法是什麼?酸洗並保存到文件中,然後每次發出新的請求時打開文件?哦,對,只是看到你的編輯。是的,我認爲可能會出現併發症。 – Acorn 2010-07-11 12:15:02