我有一个函数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
答案 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, ...)