如何在Python中使用redis锁防止异步作业
目前,我使用Redis在Python代码(Odoo)中执行QueueJob(优先级队列),我遇到了异步问题(将有一些作业同时在同一记录中执行相同的任务-更新/删除) 正如我从Redis文档中读到的,我需要实现一个锁来防止异步问题。然而,我不知道为什么锁没有像我期望的那样运行 下面是我的代码:如何在Python中使用redis锁防止异步作业,python,redis,odoo-12,Python,Redis,Odoo 12,目前,我使用Redis在Python代码(Odoo)中执行QueueJob(优先级队列),我遇到了异步问题(将有一些作业同时在同一记录中执行相同的任务-更新/删除) 正如我从Redis文档中读到的,我需要实现一个锁来防止异步问题。然而,我不知道为什么锁没有像我期望的那样运行 下面是我的代码: import redis import redis_lock #(python-redis-lock lib) class PriorityQueue(object): def __init__(
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,请帮我解决这个问题 您忘记释放锁。 redis_lock.acquire()总是返回False 事实并非如此。第一次至少有一个作业获得了锁当您忘记释放锁时,锁仍然存在。任何后续请求都失败了。要解决此问题,您需要释放锁
self.redis\u lock.release()
。以下是一个例子:
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"))
// do the job ; you can also release the lock here.
job_result = ChannelJob(job_data)
// release the lock, so other can acquire it.
self.redis_lock.release()
return job_result
else:
print("Lock is used by other job")
要了解有关锁的更多信息:另外,如果没有为锁定义超时,请手动查找该redis密钥并将其删除。