Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中使用redis锁防止异步作业_Python_Redis_Odoo 12 - Fatal编程技术网

如何在Python中使用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__(

目前,我使用Redis在Python代码(Odoo)中执行QueueJob(优先级队列),我遇到了异步问题(将有一些作业同时在同一记录中执行相同的任务-更新/删除)

正如我从Redis文档中读到的,我需要实现一个锁来防止异步问题。然而,我不知道为什么锁没有像我期望的那样运行

下面是我的代码:

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密钥并将其删除。