阅读了各种解释Python中的GIS和线程的文章,以及非常有用的回答“由于GIL,多线程Python代码中是否不需要锁?”后,我有一个“最后的问题”。
如果理想情况下,我的线程只通过原子(Python VM)指令操作共享数据,例如向列表附加项目,则不需要锁定,对吗?
如果理想情况下,我的线程只通过原子(Python VM)指令操作共享数据,例如向列表附加项目,则不需要锁定,对吗?
这真的取决于您的应用程序。就像在任何其他语言中一样,您可能需要针对特定用例使用锁,但是您不需要保护Python对象免受损坏。从这个意义上说,您不需要锁。
以下是一个示例,它使用了一堆几乎原子操作,但是当您将它们组合在一起时仍可能表现出意外行为。
线程1:
v = l[-1]
DoWork(v]
del l[-1]
线程2:
l.append(3)
当你在线程之间共享数据时,你应该始终确保你的数据被正确同步,因为你不能依赖于未来操作是否是原子的。
首次正确设计多线程比尝试修复由于实现变更或错误假设而导致的问题要容易得多。