Найти - Пользователи
Полная версия: у поставщика REST API ограничения на частоту запросов, какое правильное решение в данном случае?
Начало » Python для экспертов » у поставщика REST API ограничения на частоту запросов, какое правильное решение в данном случае?
1
ivn
Добрый день.
У поставщика REST API ограничения на частоту запросов в 0.2 секунды, какое правильное решение в данном случае?
Так же обращения к API идет из разных потоков (используется один логин и пароль к API).
Пробую использовать redis:
 while self._redis.get('pause'):
    time.sleep(1)
    print('PAUSE:', self.user)
 self._redis.set('pause', self.user, ex=2)
т.е. в каждом потоке такая конструкция, но все равно иногда происходят исключения, т.е. поставщик возвращает код ошибки, что очень частое обращение (можно не больше 0.2 секунды).

Как было бы верно с этим работать?
Спасибо, за помощь.
py.user.next
Нужен какой-то “семафор” с таймером. Главное, эту задержку не встраивать в программу, иначе потом эта задержка не будет нужна, а ты её не сможешь вырубить и топором из программы и задержка будет продолжать выполняться.
JOHN_16
ivn
но все равно иногда происходят исключения
Я предполагаю потмоу что у вас не решена проблема “гонок данных” в приведенном коде. Между get и set есть время куда может вклиниться еще один поток. Здесь нужны атомарные операции. Я думаю что можно воспользоваться вот этим setnx изменив саму логику вашего кода. Почитайте документацию и попробуйте переделать. Я думаю у вас получится и вы решите проблему.
ivn
JOHN_16
пока не получается, если есть идеи, буду рад их рассмотреть и обсудить

вот такой код нашел еще:
 import redis
from contextlib import contextmanager
r = r = redis.StrictRedis(host='localhost', port=6379, db=0)
class LockedException(Exception):
    pass
@contextmanager
def redis_lock(lock_id):
    """
    with redis_lock('unique_redis_key'):
        some code here
    """
    if r.get(lock_id):
        raise LockedException('LockedException')
    else:
        r.set(lock_id, 1)
        try:
            yield
        finally:
            r.delete(lock_id)
ivn
JOHN_16
По изучал, то что Вы предложили:
setnx
и там есть ссылка на Redlock algorithm
сделал кот следующим (вместо который в первом посте):
 dlm = Redlock([{"host": "redis_db", "port": 6379, "db": 0}, ])
while True:
    my_lock = dlm.lock("my_resource_name", 1000)
    if my_lock:
        break

получения данных по API прошли без ошибок, сейчас буду пробовать снизить таймер с 1000 до 20ms (согласно документации API провайдера)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB