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之间,哪一个答案最合适。要想变得健壮,你必须抓住例外。在一般情况下,即使您的锁是完美的,另一个程序也可能会意外地从您下面更改文件或文件夹。完成后,您可以评估是否也使用锁或条件来增加价值。在某些地方,它们肯定是有用的,但我不认为这是其中之一。一旦捕获到异常,锁将为该解决方案增加额外的复杂性,而不会提供任何额外的安全性。