当条件为false时,为什么if语句中的代码会运行?

问题描述

我有一个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个小时的处理时间,而且我讨厌某些东西被删除/覆盖。

解决方法

请参考这篇Python sharing a lock between processes帖子。

您可以使用此处提到的ManagerLock在该部分代码中创建关键部分。换句话说,这将导致到达该线程的第一个线程阻止其他线程执行那部分代码,只有在释放锁之后,它们才能继续以自己的方式继续运行。