Блокировка redis: redispy против python-redis-lock

За исключением того, что модуль python-redis-lock предоставляет контекстный менеджер для объекта блокировки - каковы различия по сравнению с объектом блокировки, который вы получаете из модуля redispy? Что такого особенного в python-redis-lock?

rc = Redis.from_url(settings.BROKER_URL)
lock_str = "bld-%s-lock" % bld_id

Используя redispy:

lock = rc.lock(lock_str)

Использование python-redis-lock:

lock = redis_lock.Lock(rc, lock_str)

не большая разница IMO, можно было бы придерживаться redispy. redispy.Lock реализован (release) как в конвейерах, так и в Lua, с поддержкой потоковой передачи, python-redis-lock только в Lua, но имеет интеграцию с Django.

georgexsh 18.09.2018 10:26
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
10
1
1 999
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, что диспетчер контекста не является здесь основным отличием, потому что, если вы видите код redis-py Замок, у них есть добавленные __enter__ и __exit__.

Оба замка, похоже, используют SETNX для получения блокировки:

  • python-redis-lock: Github
  • redis-py Блокировка: Github

Основное различие, которое я увидел, заключалось в способе блокировки работы потоков.

  • В случае Python-Redis-Lock они использовали механизм BLPOP для блокировки потока, что, на мой взгляд, похоже на использование собственной версии механизма блокировки redis. Код на Github

Something like:

timed_out = not self._client.blpop(self._signal, blpop_timeout) and timeout

  • В случае Redis-Py они, похоже, используют модуль времени и его метод спать, чтобы заблокировать поток, чтобы проверить, есть ли тайм-аут блокировки.

Something like:

import time as mod_time

...
stop_trying_at = mod_time.time() + blocking_timeout
...
mod_time.sleep(sleep)

Другие вопросы по теме