python - 在多处理时正确检查文件存在

标签 python multiprocessing file-exists

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

相关文章:

android - 检查服务器上是否存在 URL

python - 如何使用滚动汇总功能控制 pandas groupby 返回的索引

Python条件变量设置

python - 如何在python中的负数前添加括号

matplotlib - 如何解决 python 多处理 matplotlib savefig() 问题?

hadoop - 检查表是否存在并将数据加载到Hbase和HIve表中

php - 如何读取文件,如果文件或目录在 Windows 共享驱动器(映射驱动器)上可用,请使用 php

python 入口小部件元组组合

python - 多处理池意外杀死线程

针对 fuzzywuzzy 的 Python 多处理列表