Ограничить количество выполнений метода класса в секунду

Есть парсер написанный на 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):
        ...
→ Ссылка