我有一个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...
有什么想法如何实现基于字符串的“某种”系统范围互斥体?
答案 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()结束之前)调用此脚本,它将选择相同的字符串。有没有办法在整个脚本结束执行之前保持该锁定?