Python GIL和线程同步

在阅读了各种可以在Python中解释GIS和线程的文章之后,并且由于GIL,在多线程Python代码中锁是不必要的? 这是一个非常有用的答案,我有一个“最后一个问题”。

理想情况下,如果我的线程仅通过原子(Python VM)指令对共享数据进行操作,例如将一个项目附加到列表中,则不需要锁定,对吧?


这真的取决于你的应用程序。 您可能需要锁定您的特定用例,就像使用其他语言一样,但您无需保护python对象无论如何都会被损坏。 从这个意义上说,你不需要锁。

这里有一个例子,它使用了大量的原子操作,但是当你将它们结合起来时,仍然可能以意想不到的方式运行。

主题1:

v = l[-1]
DoWork(v]
del l[-1]

主题2:

l.append(3)

如果线程2在线程1的第一个和最后一个语句之间运行,则线程1刚刚删除了错误的工作项。 python对象没有任何损坏或任何东西,但是你仍然有一个意外的结果,并且可能抛出异常。

如果你有共享的数据结构,你通常需要用锁来保护它们,或者更好地使用已经写好的受保护版本,比如在这种情况下可能是一个Queue:http://docs.python.org/library/queue.html


理论上不是,但它取决于逻辑,例如,当你维持秩序时你需要一个锁。


当你在线程之间共享数据时, 你应该始终确保你的数据被正确地同步,因为你不能依赖于将来的操作是否是原子操作。

首先得到多线程设计比试图解决由于实现方面的变化或错误假设而导致中断的东西更容易。

链接地址: http://www.djcxy.com/p/86465.html

上一篇: Python GIL and threads synchronization

下一篇: How can an interpretive language avoid using Global Interpreter lock (GIL)?