Ограничить количество выполнений метода класса в секунду
Есть парсер написанный на Python, но имеется одна маленькая проблема, стороннее API может вытерпеть только 7 запросов в секунду, иначе банит по IP. Как мне ограничить количество запросов к API чтобы не получить собственно этот бан?
class Parser:
def __init__(self):
...
def _make_requests(self):
...
def start_parse(self):
...
parse = Parser()
''' Тут должен быть многопоточный вызов функции start_parse '''
примерная структура, и хотелось бы сделать ограничение на метод _make_requests потому что все запросы которые выполняются в классе завязаны на нём, чтобы при вызове более 3 start_parse не ловить бан по IP. Если я правильно понимаю концепцию ООП, если ограничить на make_requests для каждого вызова _make_requests будет ограничение, но не понимаю как его сделать
Ответы (1 шт):
Автор решения: ddo5
→ Ссылка
Для решения проблемы можно воспользоваться счетчиком запросов:
import time
class Parser:
__MAX_REQUESTS_COUNT_PER_SECOND = 7
__requests_count = 0
__requests_st = 0
def __init__(self):
...
def __increment_requests_count():
if Parser.__requests_count == 0:
Parser.__requests_st = time.time()
elif Parser.__requests_count > Parser.__MAX_REQUESTS_COUNT_PER_SECOND - 1:
et = time.time()
if et - Parser.__requests_st < 1:
#Тут нужно вызывать исключение и ловить его в _make_requests
raise Exception('У вас слишком много запросов')
else:
Parser.__requests_st = time.time()
Parser.__requests_count = 0
Parser.__requests_count += 1
def _make_requests(self):
try:
Parser.__increment_requests_count()
...
except Exception as err:
#Вызов исключения / завершение метода
return
def start_parse(self):
...