问题描述
if not os.path.exists(os.path.dirname(save_to)):
os.makedirs(os.path.dirname(save_to))
此后,无论文件先前是否存在,文件都会添加到目录save_to
中。
有时,即使目录已经存在,也会执行if
语句中的代码。这是完全随机的。
我相信这是因为我正在使用multiprocessing.Pool.map
将此任务分配给多个cpu。我认为进程1和2进入if
语句中。我认为进程1然后创建目录,然后进程2尝试失败。
这是我得到的错误:
multiprocessing.pool.RemoteTraceback:
"""
Traceback (most recent call last):
File "/home/WNeill/anaconda3/lib/python3.8/multiprocessing/pool.py",line 125,in worker
result = (True,func(*args,**kwds))
File "/home/WNeill/anaconda3/lib/python3.8/multiprocessing/pool.py",line 51,in starmapstar
return list(itertools.starmap(args[0],args[1]))
File "/home/WNeill/who-said-what/wsw/preprocessing.py",line 147,in clip_audio ****!!!****
os.makedirs(os.path.dirname(save_to)) ****!!!****
File "/home/WNeill/anaconda3/lib/python3.8/os.py",line 223,in makedirs
mkdir(name,mode)
FileExistsError: [Errno 17] File exists: '/home/WNeill/clipped/clipped/aldfly'
我想不出第147行的任何其他原因,该行对应于上面执行的代码段(也在堆栈跟踪中标记)。
问题:
如何解决这个问题(无论我的假设是否正确)?
建议的解决方案:
我唯一的想法是也许使用参数exist_ok=True
并摆脱if
语句。如果我使用这种方法,我担心会覆盖工作。我大约需要8个小时的处理时间,而且我讨厌某些东西被删除/覆盖。
解决方法
请参考这篇Python sharing a lock between processes帖子。
您可以使用此处提到的Manager
和Lock
在该部分代码中创建关键部分。换句话说,这将导致到达该线程的第一个线程阻止其他线程执行那部分代码,只有在释放锁之后,它们才能继续以自己的方式继续运行。