Python GIL与线程同步
我看了很多关于GIS和Python中线程的文章,还有一篇非常有用的回答,讨论了“因为有GIL,Python多线程代码中锁是不是没必要”。现在我有一个“最后的问题”。
如果我的线程理想情况下只通过一些简单的操作来处理共享数据,比如往列表里添加一个项目,那么就不需要锁对吧?
4 个回答
0
当你在不同的线程之间共享数据时,一定要确保你的数据是正确同步的,因为你不能指望未来的操作会始终是原子的(也就是不会被打断的)。
一开始就把多线程的设计做好,比起之后因为实现的变化或错误的假设而去修复出现的问题要容易得多。
0
理论上来说不是,但这要看具体的逻辑。如果你需要保持某种顺序,比如说,就需要用到锁。
2
这其实要看你的应用场景。就像在其他编程语言中一样,你可能需要使用锁来保护特定的用例,但在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