В настоящее время я использую Redis для выполнения QueueJob (Очередь приоритетов) в коде Python (Odoo), и я сталкиваюсь с асинхронной проблемой (Там будут некоторые задания, выполняющие ту же задачу - обновить / удалить в той же записи на в то же время).
Как я прочитал из документации Redis, мне нужно реализовать LOCK для предотвращения асинхронной проблемы. Однако я не понимаю, почему блокировка не работает так, как я ожидаю.
Ниже приведен мой код:
import redis
import redis_lock #(python-redis-lock lib)
class PriorityQueue(object):
def __init__(self, queue_name):
...
self.redis = redis.StrictRedis(...)
self.redis_lock = redis_lock.Lock(self.redis, queue_name)
def first(self):
if self.redis_lock.acquire(blocking=False):
print("Perform task")
job = self.redis.zrevrange(self.queue_name, 0, 0)[0]
job_data = json.loads(job.decode("utf-8"))
return ChannelJob(job_data)
else:
print("Lock is used by other job")
def pop(self):
job = self.redis.zpopmax(self.queue_name, count=1)
job_data = json.loads(job.decode("utf-8"))
return ChannelJob(job_data)
redis_lock.acquire () всегда возвращает False, пожалуйста, помогите мне решить эту проблему.