如何在创建目录后打开文件时避免竞争条件?

时间:2015-11-12 20:06:51

标签: python filesystems race-condition

考虑以下代码:

os.mkdir('foo')
open('foo/bar.txt')

我试过了:

try:
    os.makedir('foo')
except OSError, e:
    if e.errno != errno.EEXIST:
        raise
open('foo/bar.txt')

和此:

try:
    open('foo/bar.txt')
except IOError:
    os.makedir('foo')
    open('foo/bar.txt')

但在这两种情况下,我们最终都会遇到竞争条件。一段时间以来一直在考虑这个问题,我无法找到摆脱它的方法。

任何人都有解决方案吗?

2 个答案:

答案 0 :(得分:0)

没有竞争条件,你只需要这样做:

os.mkdir('foo')
open('foo/bar.txt', 'w')

因为默认是读取模式(并且没有文件)

答案 1 :(得分:0)

您无法同时创建目录和文件。这是不可能的,所以从这个意义上讲,你总是会遇到竞争条件。

但是,您可以创建另一个目录和文件,即baz/bar.txt。确保此文件存在后,您可以执行原子操作,将baz重命名为foo,然后立即生成foo/bar.txt。这是否满足您避免竞争条件的需要?

如果没有,您需要进一步举例说明您在特定情况下的竞争条件以及您想要避免的内容。