我有一个if语句,检查目录是否已经存在:
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个小时的处理时间,我讨厌删除/覆盖某些内容
一个有点大的解决办法是参考这篇文章
您可以使用这里提到的
Manager
和Lock
在代码的该部分创建一个关键部分。换句话说,这将导致到达那里的第一个线程阻止其他线程执行该部分代码,只有在释放锁之后,它们才能继续它们的快乐之路相关问题 更多 >
编程相关推荐