блокировка redis: redispy против python-redis-lock - PullRequest
0 голосов
/ 12 сентября 2018

Кроме того, что модуль python-redis-lock предоставляет contextmanager для объекта блокировки - какие различия по сравнению с объектом блокировки, который вы получаете из модуля 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)

1 Ответ

0 голосов
/ 22 сентября 2018

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

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

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

  • В случае python-redis-lock они использовали механизм BLPOP для блокировки потока, что, мне кажется, использует собственную версию механизма блокировки redis. код Github

Что-то вроде:

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

  • В случае redis-py они, кажется, используют модуль времени и его sleep метод, чтобы заблокировать поток, чтобы проверить, истекло ли время блокировки.

Что-то вроде:

import time as mod_time

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