Python 多处理时正确检查文件存在性

Python 多处理时正确检查文件存在性,python,multiprocessing,file-exists,Python,Multiprocessing,File Exists,我有一个函数,myfunc,它在并行处理中被调用。当我让几个进程共享同一个目标文件夹时,所有进程都并行调用myfunc,并检查目标文件夹是否存在。如果它已经存在,那没问题。但是,如果在启动脚本之前文件夹不存在,则第一个进程将进入if块并创建文件夹。另一方面,将有另一个进程同时进入非常相同的if块“几乎”,将发现文件夹不存在,并尝试创建它,而第一个进程实际上正在创建它或已经创建了它。因此,在某个时刻会出现一个OSError,告诉您文件夹已经存在 在进行多处理时,是否有一种干净的方法来处理此问题?在

我有一个函数,
myfunc
,它在并行处理中被调用。当我让几个进程共享同一个目标文件夹时,所有进程都并行调用
myfunc
,并检查目标文件夹是否存在。如果它已经存在,那没问题。但是,如果在启动脚本之前文件夹不存在,则第一个进程将进入if块并创建文件夹。另一方面,将有另一个进程同时进入非常相同的if块“几乎”,将发现文件夹不存在,并尝试创建它,而第一个进程实际上正在创建它或已经创建了它。因此,在某个时刻会出现一个
OSError
,告诉您文件夹已经存在

在进行多处理时,是否有一种干净的方法来处理此问题?在启动进程之前,我考虑在函数
myfunc
中处理目标文件夹。不过,出于知识的考虑,最好使用多处理找到一个解决方案

import os, sys

def myfunc(file_names, destination=None, file_permission=None, verbose=False):
    absPath = os.path.abspath(file_names[0])
    baseName = os.path.basename(absPath)
    dirName = os.path.dirname(absPath)


    destination_folder = "/default/destination" if destination is None \
        else os.path.abspath(destination)

    if not os.path.isdir(destination_folder):
        os.mkdir(destination_folder)
        os.chmod(destination_folder, file_permission)
        if verbose:
            print "Created directory", destination_folder

使用
threading
模块中的
Lock
解决并发问题:

import os, sys
from threading import Lock

def myfunc(lock, ...):
    ... do stuff as usual ...

    with lock:
        destination_folder = "/default/destination" if destination is None \
            else os.path.abspath(destination)

    ... do everything else as usual ...

if __name__ == "__main__":
    my_lock = Lock()
    myfunc(my_lock, ...)

在大多数情况下,检查文件/文件夹是否存在并根据结果采取行动是根本错误的,因为即使您不是多处理,您也不知道计算机上还运行着什么。即使您最初并不打算这样做,也很难保证其他人以后不会运行您流程的多个副本


最可靠的方法是始终尝试创建文件夹,并默默地忽略“但已存在”错误。(不要忽略其他错误,例如“但您没有该权限!”)这仍然是最好的方法,即使您在启动多处理之前进行了一次检查

那么,捕获异常?如果使用
多处理
(根据标题),则使用等效的
多处理.Lock
。您认为应该使用捕获异常和锁定的组合吗?事实上,我不知道在你和th3an0maly之间,哪一个答案最合适。要想变得健壮,你必须抓住例外。在一般情况下,即使您的锁是完美的,另一个程序也可能会意外地从您下面更改文件或文件夹。完成后,您可以评估是否也使用锁或条件来增加价值。在某些地方,它们肯定是有用的,但我不认为这是其中之一。一旦捕获到异常,锁将为该解决方案增加额外的复杂性,而不会提供任何额外的安全性。