在CGI脚本中限制对API请求的速率

0 投票
2 回答
905 浏览
提问于 2025-04-16 01:07

我正在写一个脚本,这个脚本有时候会向一个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) 让程序暂停执行指定的秒数。这个参数可以是小数,表示更精确的暂停时间。实际的暂停时间可能会比你请求的时间短,因为如果有信号被捕获,程序会在处理完这个信号后结束休眠。此外,暂停的时间也可能会因为系统中其他活动的调度而比请求的时间长。

撰写回答