【发布时间】:2020-02-20 06:09:35
【问题描述】:
我正在尝试编写一个函数,该函数能够确定调用它的进程是否是第一个调用它的进程,而无需使用任何锁。
这是我当前的实现。
def is_first_process(path):
filename = os.path.join(path, "first.file")
try:
fd = os.open(filename, os.O_CREAT | os.O_EXCL | os.O_WRONLY)
os.close(fd)
return True
except FileExistsError:
return False
我这样测试上面的函数:
def test_is_first_process():
path = "/tmp/first_process"
shutil.rmtree(path, ignore_errors=True)
process_list = []
def helper(fn, arg, shared_list):
shared_list.append(fn(arg))
for _ in range(1000):
makedirs(path)
manager = Manager()
results = manager.list()
for i in range(1000):
p = Process(target=helper, args=(is_first_process, path, results))
p.start()
process_list.append(p)
for p in process_list:
p.join()
assert results.count(True) == 1
shutil.rmtree(path, ignore_errors=True)
对于较大的 m*n,测试错误会出现以下错误:
E OSError: [Errno 24] Too many open files
但不适用于较小的值 (m*n
我对 os.O_EXCL 标志的理解是,如果 FileExistsError 已经存在,它会引发它。
我对这个标志的理解不正确吗? 如何正确实现和测试可以确定写入目录的第一个进程的函数?
【问题讨论】:
标签: python