我有一个函数myfunc
,它在并行处理中被调用。当我让多个进程共享同一个目标文件夹时,所有进程都会并行调用 myfunc 并检查目标文件夹是否存在。如果它已经存在,就没问题。但是,如果在启动脚本之前该文件夹不存在,则第一个进程将进入 if block 并创建该文件夹。另一方面,将会有另一个进程“几乎”同时进入完全相同的 if block ,会发现该文件夹不存在,并会尝试创建它,而第一个进程实际上正在创建它或已经做到了。因此在某些时候会出现一个 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
最佳答案
在大多数情况下,检查文件/文件夹是否存在并根据结果采取操作从根本上来说是错误的,因为即使您没有进行多处理,您也不知道计算机上还运行着什么。也很难保证其他人以后不会运行您的流程的多个副本,即使您最初并不打算这样做。
最可靠的方法是始终尝试创建文件夹,并默默地忽略“但已经存在”错误。 (不要忽略其他错误,例如“但是您没有该权限”!)即使您在开始多重处理之前进行了一次检查,这仍然是最好的方法。
关于python - 在多处理时正确检查文件存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36628421/