Python GIL和线程同步

时间:2011-08-17 20:17:46

标签: python multithreading gil

在阅读了各种用Python解释GIS和线程的文章后,Are locks unnecessary in multi-threaded Python code because of the GIL?这是一个非常有用的答案,我有一个“最后一个问题”。

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

4 个答案:

答案 0 :(得分:1)

这实际上取决于您的申请。您可能需要锁定特定用例,就像任何其他语言一样,但您无需保护python对象无论如何都会被破坏。从这个意义上说,你不需要锁。

这是一个使用大量原子操作的示例,但在组合它们时仍然会以意想不到的方式运行。

主题1:

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

主题2:

l.append(3)

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

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

答案 1 :(得分:0)

理论上不是,但它取决于逻辑,例如,在保留秩序时需要锁定。

答案 2 :(得分:0)

当您在线程之间共享数据时,应该始终确保数据已正确同步,因为您不能依赖于其他操作,将来也不会是原子操作。

首先更容易获得多线程设计,而不是尝试修复因实现更改或错误假设而中断的内容。

答案 3 :(得分:0)

谢谢大家的答案! 很明显,线程同步要求绑定到应用程序逻辑,但我可以依赖GIL来破坏内置对象内部(操作是原子的)。我不清楚GIL我说保护解释器的“内部状态”,它的内部数据结构......我的意思是,这是一个效果,但GIL保护每个分配的内置结构,对于对象由解释器的内部操作和应用程序创建的对象创建和使用。这是我的疑问。

PS:很抱歉这么晚才回答,但我没有收到电子邮件通知......