<p>实际上,<em>是实现这一点的一种方法,原子的和安全的,<strong>前提是所有参与者都以相同的方式进行。这是对<a href="http://www.cl.cam.ac.uk/techreports/UCAM-CL-TR-697.pdf#page=66" rel="nofollow noreferrer">lock-free whack-a-mole algorithm</a>的改编,并不完全是琐碎的,所以请随意使用“no”作为一般答案;)</p>
<h2>怎么办</h2>
<ol>
<li>检查文件是否已存在。如果是的话就停下来。</li>
<li><a href="https://docs.python.org/2/library/uuid.html#uuid.uuid4" rel="nofollow noreferrer">Generate a unique ID</a></li>
<li>将源文件复制到具有临时名称的目标文件夹,例如<code><target>.<UUID>.tmp</code>。</li>
<li>重命名副本<code><target>-<UUID>.mole.tmp</code>。</li>
<li><a href="https://docs.python.org/2/library/glob.html" rel="nofollow noreferrer">Look for any other files matching the pattern</a><code><target>-*.mole.tmp</code>。
<ul>
<li>如果他们的UUID比你的大,<a href="https://docs.python.org/2/library/os.html#os.remove" rel="nofollow noreferrer">attempt to delete it</a>。(如果它不见了,不用担心。)</li>
<li>如果他们的UUID比你的少,尝试删除你自己的。(再说一次,不用担心它是否消失了)从现在起,把他们的UUID当作是你自己的。</li>
</ul></li>
<li>再次检查目标文件是否已存在。如果是,请尝试删除临时文件。(不用担心它是否消失了。请记住,您的UUID可能在步骤5中已更改。)</li>
<li>如果在步骤6中还没有尝试删除它,请尝试将临时文件重命名为其最终名称<code><target></code>。(如果它不见了,不用担心,跳回到第5步。)</li>
</ol>
<p>你完了!</p>
<h2>工作原理</h2>
<p>假设每个候选源文件都是一个从洞里出来的鼹鼠。中途,它会暂停并将任何竞争的鼹鼠打回地面,然后再检查没有其他鼹鼠完全出现。如果你在脑子里想清楚了,你会发现只有一只鼹鼠能一路逃出去。为了防止这个系统<a href="https://en.wikipedia.org/wiki/Deadlock#Livelock" rel="nofollow noreferrer">livelocking</a>,我们添加了一个总的顺序,鼹鼠可以在这个总的顺序上攻击哪个。砰!博士论文。</p>
<p><sup></sup>步骤4可能看起来不必要,为什么不首先使用该名称?然而,在第5步中,另一个过程可能会“采用”您的<strike>mole</strike>文件,并在第7步中使其成为赢家,因此您不必继续写出内容是非常重要的!在同一个文件系统上重命名是原子的,因此步骤4是安全的。</p>