擅长:python、mysql、java
<p>在任何时候,是的,只有一个线程在执行Python代码(其他线程可能正在执行一些IO、NumPy等等)。这基本上是真的。然而,这在任何单处理器系统上都是如此,然而人们在单处理器系统上仍然需要锁。在</p>
<p>请查看以下代码:</p>
<pre><code>queue = []
def do_work():
while queue:
item = queue.pop(0)
process(item)
</code></pre>
<p>只有一根线,一切都很好。对于两个线程,您可能会从<code>queue.pop()</code>得到异常,因为另一个线程首先对最后一个项目调用了<code>queue.pop()</code>。所以你得想办法解决这个问题。使用锁是一个简单的解决方案。您也可以使用适当的并发队列(比如<code>queue</code>模块),但是如果您查看<code>queue</code>模块内部,您会发现<code>Queue</code>对象中有一个<code>threading.Lock()</code>。所以不管怎样你都在用锁。在</p>
<p>在没有必要的锁的情况下编写多线程代码是一个常见的新手错误。你看了代码,然后想,“这会很好的工作”,然后在几个小时后发现,一些真正奇怪的事情发生了,因为线程没有正确地同步。在</p>
<p>或者简而言之,在多线程程序中有许多地方需要防止另一个线程修改结构,直到应用完一些更改为止。这允许您在数据上维护不变量,如果您不能维护不变量,那么基本上不可能编写正确的代码。在</p>
<p>或者用最短的方式说,“如果你不在乎你的代码是否正确,你就不需要锁。”</p>