Python 即使使用O_EXCL,打开的文件也太多

Python 即使使用O_EXCL,打开的文件也太多,python,Python,我正在尝试编写一个函数,该函数能够确定调用它的进程是否是第一个这样做的,而不使用任何锁 这是我当前的实现 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) retu

我正在尝试编写一个函数,该函数能够确定调用它的进程是否是第一个这样做的,而不使用任何锁

这是我当前的实现

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操作错误:[Errno 24]打开的文件太多

但不适用于较小的值m*n<100

我对os.O_EXCL标志的理解是,如果它已经存在,它将引发FileExistError

我对这面旗帜的理解有误吗?
如何正确实现和测试可以确定写入目录的第一个进程的函数?

我认为您可能误解了看到的错误。关于打开的文件过多的错误消息表示您同时打开的文件过多。一次打开一个文件不一定要多次

可能是处理进程间通信的多处理代码导致您试图同时启动的1000个单独进程出现问题。这是很多过程

许多操作系统限制每个进程可以打开的文件数量,并且通常还限制每个用户登录,因此即使在大量进程中的每个进程中只打开几个文件,也可能会出现问题。您可以使用ulimit-n或类似的配置程序修改系统上的限制

但真正的问题是,为什么您认为您需要一次测试1000个进程?即使在一个大型系统上,您可能也不会有那么多的CPU内核,因此这些进程中的大多数必然处于休眠状态,而只有少数进程在运行。我建议您使用多个进程进行测试,这些进程最多只能是系统内核数的2倍,更多的只是浪费您的时间