Форум сайта python.su
Добрый день.
У поставщика 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)
Отредактировано ivn (Май 23, 2019 01:25:08)
Офлайн
Нужен какой-то “семафор” с таймером. Главное, эту задержку не встраивать в программу, иначе потом эта задержка не будет нужна, а ты её не сможешь вырубить и топором из программы и задержка будет продолжать выполняться.
Отредактировано py.user.next (Май 23, 2019 03:16:40)
Офлайн
ivnЯ предполагаю потмоу что у вас не решена проблема “гонок данных” в приведенном коде. Между get и set есть время куда может вклиниться еще один поток. Здесь нужны атомарные операции. Я думаю что можно воспользоваться вот этим setnx изменив саму логику вашего кода. Почитайте документацию и попробуйте переделать. Я думаю у вас получится и вы решите проблему.
но все равно иногда происходят исключения
Офлайн
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)
Офлайн
JOHN_16По изучал, то что Вы предложили:
dlm = Redlock([{"host": "redis_db", "port": 6379, "db": 0}, ]) while True: my_lock = dlm.lock("my_resource_name", 1000) if my_lock: break
Отредактировано ivn (Май 23, 2019 22:43:04)
Офлайн