Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
pythongil与线程同步_Python_Multithreading_Gil - Fatal编程技术网

pythongil与线程同步

pythongil与线程同步,python,multithreading,gil,Python,Multithreading,Gil,在阅读了各种用Python解释GIS和线程的文章之后,这是一个非常有用的答案,我有一个“最后一个问题” 理想情况下,如果我的线程只通过(例如)将一个项目附加到列表中来对共享数据进行操作,则不需要锁,对吗 这取决于您的应用程序。与任何其他语言一样,您可能需要针对特定用例使用锁,但无论如何,您都不需要保护被破坏的python对象。从这个意义上说,你不需要锁 这里有一个例子,它使用了大量的原子操作,但是当您将它们组合在一起时,仍然可以以意外的方式进行操作 线程1: v = l[-1] DoWork(v

在阅读了各种用Python解释GIS和线程的文章之后,这是一个非常有用的答案,我有一个“最后一个问题”


理想情况下,如果我的线程只通过(例如)将一个项目附加到列表中来对共享数据进行操作,则不需要锁,对吗

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

这里有一个例子,它使用了大量的原子操作,但是当您将它们组合在一起时,仍然可以以意外的方式进行操作

线程1:

v = l[-1]
DoWork(v]
del l[-1]
线程2:

l.append(3)
如果线程2在线程1的第一个和最后一个语句之间运行,那么线程1只是删除了错误的工作项。所有python对象都没有损坏或其他任何东西,但仍然会得到意外的结果,并且可能会引发异常


如果您有共享的数据结构,通常需要使用锁来保护它们,或者更好地使用已编写的受保护版本,例如在本例中可能是一个队列:

理论上不是,但这取决于逻辑,例如,当您在线程之间共享数据时,您需要一个锁,您应该始终确保数据正确同步,因为您不能依赖于将来的操作是否为原子操作


首先,正确的多线程设计要比修复由于实现更改或错误假设而出现的问题更容易。

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


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

不要使用链接缩短器。此外,此网站上其他问题的链接将自动替换为问题的标题。