Python GIL和线程同步

3

5
请勿使用链接缩短工具。此外,该网站上其他问题的链接会自动替换为问题标题。 - agf
4个回答

2

这真的取决于您的应用程序。就像在任何其他语言中一样,您可能需要针对特定用例使用锁,但是您不需要保护Python对象免受损坏。从这个意义上说,您不需要锁。

以下是一个示例,它使用了一堆几乎原子操作,但是当您将它们组合在一起时仍可能表现出意外行为。

线程1:

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

线程2:

l.append(3)

如果第二个线程在第一个线程的第一条和最后一条语句之间运行,则第一个线程刚刚删除了错误的工作项。所有python对象都没有损坏或其他问题,但您仍然得到了意外的结果,并且可能会抛出异常。
如果您有共享数据结构,则通常需要使用锁来保护它们,或者更好地使用已经编写的受保护版本,例如在这种情况下可能是队列:http://docs.python.org/library/queue.html

0

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

首次正确设计多线程比尝试修复由于实现变更或错误假设而导致的问题要容易得多。


0
感谢大家的回答!显然,线程同步需求与应用程序逻辑有关,但我可以依赖GIL来确保不破坏内置对象内部(如果操作是原子的)。对我来说不清楚的是,当GIL被称为保护解释器的“内部状态”时,它的内部数据结构......我的意思是,这是一种效果,但GIL保护每个分配的内置结构,包括由解释器的内部操作创建和使用的对象以及应用程序创建的对象。这就是我的疑问。
PS:很抱歉回答得这么晚,但我没有收到邮件通知...

0
从理论上讲不需要,但这取决于逻辑,例如在保持顺序时就需要锁定。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接