Уведомления

Группа в Telegram: @pythonsu

#1 Май 23, 2019 01:24:21

ivn
Зарегистрирован: 2017-01-13
Сообщения: 91
Репутация: +  0  -
Профиль   Отправить e-mail  

у поставщика REST API ограничения на частоту запросов, какое правильное решение в данном случае?

Добрый день.
У поставщика 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 секунды).

Как было бы верно с этим работать?
Спасибо, за помощь.

Отредактировано ivn (Май 23, 2019 01:25:08)

Офлайн

#2 Май 23, 2019 03:09:45

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9873
Репутация: +  853  -
Профиль   Отправить e-mail  

у поставщика REST API ограничения на частоту запросов, какое правильное решение в данном случае?

Нужен какой-то “семафор” с таймером. Главное, эту задержку не встраивать в программу, иначе потом эта задержка не будет нужна, а ты её не сможешь вырубить и топором из программы и задержка будет продолжать выполняться.



Отредактировано py.user.next (Май 23, 2019 03:16:40)

Офлайн

#3 Май 23, 2019 11:05:34

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

у поставщика REST API ограничения на частоту запросов, какое правильное решение в данном случае?

ivn
но все равно иногда происходят исключения
Я предполагаю потмоу что у вас не решена проблема “гонок данных” в приведенном коде. Между get и set есть время куда может вклиниться еще один поток. Здесь нужны атомарные операции. Я думаю что можно воспользоваться вот этим setnx изменив саму логику вашего кода. Почитайте документацию и попробуйте переделать. Я думаю у вас получится и вы решите проблему.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#4 Май 23, 2019 12:40:08

ivn
Зарегистрирован: 2017-01-13
Сообщения: 91
Репутация: +  0  -
Профиль   Отправить e-mail  

у поставщика REST API ограничения на частоту запросов, какое правильное решение в данном случае?

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)

Офлайн

#5 Май 23, 2019 22:42:32

ivn
Зарегистрирован: 2017-01-13
Сообщения: 91
Репутация: +  0  -
Профиль   Отправить e-mail  

у поставщика REST API ограничения на частоту запросов, какое правильное решение в данном случае?

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 провайдера)

Отредактировано ivn (Май 23, 2019 22:43:04)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version