检查python中是否存在系统范围内的互斥锁

时间:2019-03-14 23:05:54

标签: python python-3.x mutex

我有一个python程序,有时某个调度程序可能会多次调用它。

它会按照某种模式生成一个字符串,并且我想确保未由同时运行的另一个进程(锁定字符串)生成此字符串。如果是这样,它必须按照相同的模式生成一个新的字符串,然后再次检查是否不存在。如果进程结束,则相关字符串可被新字符串(解锁字符串)重用。

示例:

t=0 
  process 1 - "string_1"

t=1 (process_1 finished)
  process 2 - "string_1"
  process 3 - "string_2" (cause "string_1" already exists)

t=2 (process 2 and 3 still running)
  process 4 - "string_3"

t=3 (procces 3 finished)
  process 5 - "string_2"

and so on...

有什么想法如何实现基于字符串的“某种”系统范围互斥体?

2 个答案:

答案 0 :(得分:0)

您可以使用某些全局资源(例如文件系统)来协调进程。 创建一个名为/tmp/string_1的文件以声明该字符串,或将string_1附加到/tmp/log或其他内容中。 如果需要,请使用文件系统锁定,或使用协调mutex

但是将uuid附加到每个字符串会更简单。 高熵唯一ID为easy to generate。 根据请求率,您也许可以使用截断的ID。

如果您确实需要计数器,请考虑让一个生产者维护它,并分发唯一的ID。 最简单的方法是通过queue。 生产者写入队列,而消费者从中读取ID。

答案 1 :(得分:0)

让我们将此代码作为我想要使用fcntl的示例:

import fcntl, time

def my_function():
    n = 0
    while n < 10:
        str = "string_{}".format(n)
        try:
            f = open('/tmp/{}'.format(str))
            print("Attempting to lock {}".format(f.name))
            fcntl.flock(f, fcntl.LOCK_EX | fcntl.LOCK_NB)
            time.sleep(3)
            return str
        except IOError:
            n += 1
    if n == 10:
        raise Exception("All options are in use")

def main():
    str = my_function()
    print(str)
    time.sleep(5)

if __name__ == "__main__":
    main()

这里的问题是,my_function()完成锁定后,锁定消失了,如果我那时(在main()结束之前)调用此脚本,它将选择相同的字符串。有没有办法在整个脚本结束执行之前保持该锁定?