我有几个线程在集群系统上从Python并行运行。每个python线程输出到一个目录mydir。每个脚本在输出前检查 mydir是否 存在,如果不存在,则创建它:
mydir
if not os.path.isdir(mydir): os.makedirs(mydir)
但这会产生错误:
os.makedirs(self.log_dir) File "/usr/lib/python2.6/os.py", line 157, in makedirs mkdir(name,mode) OSError: [Errno 17] File exists
我怀疑这可能是由于种族情况造成的,其中一个工作在另一个工作到达之前创建了 目录 。这可能吗?如果是这样,如何避免该错误?
我不确定这是否是竞争条件,所以想知道Python中的其他问题是否会导致这种奇怪的错误。
在您检查某物和对其采取行动之间,任何时间代码都可以执行,您将处于竞争状态。避免这种情况的一种方法(也是Python中通常的方法)是尝试然后处理异常
while True: mydir = next_dir_name() try: os.makedirs(mydir) break except OSError, e: if e.errno != errno.EEXIST: raise # time.sleep might help here pass
如果您有很多线程试图创建一系列可预测的目录,那么这仍然会引发很多异常,但是最终您会到达那里。在这种情况下,最好只有一个线程来创建目录