在CGI脚本中限制对API请求的速率
我正在写一个脚本,这个脚本有时候会向一个API发送请求,而这个API要求每秒最多只能发送一个请求。
那么,有什么简单的方法可以把我对这个API的请求限制为每秒一个呢?
是不是每次发送请求的时候都要把当前时间存到一个文件里呢?
2 个回答
0
你可以在想要限制调用次数的函数上使用一个叫做“速率限制”的装饰器,下面这个就是Greg Burek提供的一个例子:
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)
1
你可以为CGI调用使用一个单独的线程,并且使用一个循环的排队机制,每次循环时调用一次休眠。
来自 15.3. time
time.sleep(secs) 让程序暂停执行指定的秒数。这个参数可以是小数,表示更精确的暂停时间。实际的暂停时间可能会比你请求的时间短,因为如果有信号被捕获,程序会在处理完这个信号后结束休眠。此外,暂停的时间也可能会因为系统中其他活动的调度而比请求的时间长。