Ограничьте частоту запросов к API в CGI-скрипте - PullRequest
0 голосов
/ 11 июля 2010

Скрипт, который я пишу, иногда отправляет запросы в API, и API требует, чтобы количество запросов не превышало 1 в секунду.

Какой самый простой способ ограничить мои запросы к API до 1 каждую секунду?

Включает ли это сохранение текущего времени в файле каждый раз, когда делается запрос?

Ответы [ 2 ]

1 голос
/ 11 июля 2010

Вы можете использовать отдельный поток для вызовов CGI и механизм организации очередей, который зацикливается с вызовом для сна на каждой итерации.time

time.sleep (secs) Приостановить выполнение на указанное количество секунд.Аргумент может быть числом с плавающей запятой, чтобы указать более точное время сна.Фактическое время приостановки может быть меньше запрошенного, потому что любой перехваченный сигнал завершит sleep () после выполнения процедуры перехвата этого сигнала.Кроме того, время приостановки может быть дольше, чем запрошено на произвольную сумму, из-за планирования других действий в системе.

0 голосов
/ 27 мая 2013

Можно использовать ограничивающий скорость питон-декоратор для функции, которую нужно ограничить по скорости, например, от Грега Бурека:

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)
...