pythongil与线程同步

2024-06-28 14:45:13 发布

您现在位置:Python中文网/ 问答频道 /正文

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

如果理想情况下,我的线程只通过atomic (Python VM) instructions对共享数据进行操作,例如在列表中附加一个项,那么就不需要锁了,对吗?在


Tags: ofthe答案in文章code线程multi
3条回答

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

与试图修复由于实现中的更改或错误的假设而导致的中断相比,首先获得正确的多线程设计要容易得多。在

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

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

下面是一个使用大量原子操作的示例,但是当您将它们组合在一起时,它们仍然可以以意想不到的方式运行。在

线程1:

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

线程2:

^{pr2}$

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

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

相关问题 更多 >