多处理时正确检查文件是否存在

时间:2016-04-14 16:08:23

标签: python multiprocessing file-exists

我有一个函数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

2 个答案:

答案 0 :(得分:1)

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

最强大的方法是始终尝试创建文件夹,然后默默地忽略"但已经存在"错误。 (不要忽略其他错误,例如"但是你没有那个权限"!)即使你在开始多处理之前做了一次检查,这仍然是做事的最佳方式。

答案 1 :(得分:0)

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

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, ...)