我在使用 Python 的 Mac OS X 中遇到了一个相当奇怪的竞争条件(我只测试了 Python 3.3)。我正在创建几个临时目录,向它们写入内容,然后清除它们。类似的东西
while running:
(do something)
tempdir = mkdtemp('name')
try:
(write some stuff to tempdir)
finally:
shutil.rmtree(tempdir)
但是,在后面的一些循环中(write some stuff to tempdir)
,我得到了类似的错误
with open(os.path.join("/var/folders/yc/8wpl9rlx47qgzxqpcf003k280000gn/T/tmp0fh2ztname", "file"), 'w', encoding='utf-8') as fn:
FileNotFoundError: [Errno 2] No such file or directory: '/var/folders/yc/8wpl9rlx47qgzxqpcf003k280000gn/T/tmpups5dpname/file'
(为了清楚起见,我已经内联了 temp dir 路径)
请注意,打开的路径与找不到的路径不同。在每种情况下,错误消息中的路径都是上一次循环迭代的临时目录。
该错误大部分时间在同一个地方(大约第四次迭代之后)是可重现的,但不是每次都可以重现。
编辑:我刚刚意识到这可能是相关的。这些(write some stuff to tempdir)
东西实际上发生在一个子进程中。这就是我确定 tempdir 路径的方式,我必须将它传递给子进程(我实际上对“清晰度”位撒了谎,我实际上是在用该行写出一个 Python 文件with open
)。这就是我确定 tempdir 路径确实与正在使用的路径不同的方式。