<p>在编程中,这被称为<a href="http://web.mit.edu/6.005/www/fa14/classes/17-concurrency/#:%7E:text=Concurrency%20means%20multiple%20computations%20are,cores%20on%20a%20single%20chip" rel="nofollow noreferrer">concurrency</a>,这是指计算同时发生,且执行顺序无法保证的情况。在您的情况下,一个程序在另一个程序完成对文件的写入之前开始读取该文件。这个特殊的问题称为<a href="https://en.wikipedia.org/wiki/Readers%E2%80%93writers_problem" rel="nofollow noreferrer">reader-writers problem</a>,实际上在嵌入式系统中相当常见</p>
<p>这个问题有很多解决方案,但最简单和最常见的是<a href="https://en.wikipedia.org/wiki/Lock_(computer_science)" rel="nofollow noreferrer">lock</a>。最简单的锁可以防止一个资源同时被多个程序访问。实际上,它确保资源上的操作以原子方式进行。锁被实现为一个对象,可以<em>获取</em>或<em>释放</em>(这些通常是对象的函数)。程序尝试在循环中获取锁,只要程序没有获取锁,循环就会迭代。当获得锁时,它会授予持有锁的程序执行某些代码块的能力(这通常是一个简单的if语句),然后释放锁。请注意,我所指的程序通常称为<a href="https://simple.wikipedia.org/wiki/Thread_(computer_science)" rel="nofollow noreferrer">thread</a></p>
<p>在Python中,可以使用<a href="https://docs.python.org/3.8/library/threading.html#lock-objects" rel="nofollow noreferrer">^{<cd1>}</a>对象。首先,需要创建一个锁对象</p>
<pre class="lang-py prettyprint-override"><code>from threading import Lock
file_lock = Lock()
</code></pre>
<p>然后在每个线程中,等待获取锁后再继续。如果设置<code>blocking=True</code>,它将导致整个线程停止运行,直到获得锁为止,而不需要循环</p>
<pre class="lang-py prettyprint-override"><code>file_lock.acquire(blocking=True):
# atomic operation
file_lock.release()
</code></pre>
<p>请注意,每个线程中应使用相同的锁对象。在</em>读取和写入文件之前,需要获取锁<em>,在</em>读取和写入文件之后,需要释放锁<em>。这将确保这些操作不会再次同时发生</p>