我如何在多线程应用程序中使用GIL作为字典?

时间:2015-03-27 12:29:43

标签: python multithreading dictionary gil

我遇到错误'RuntimeError:字典在迭代期间改变了大小',同时迭代一个线程中的字典,该字符被插入到 Python 2.7 中的另一个线程中。我发现通过使用Global Intrepreter Lock,我们可以在mutithreaded情况下锁定一个对象。

      In thread1:
           dictDemo[callid]=val
      in thread2:
           for key in dictDemo:   
                    if key in dictDemo:
                            dictDemo.pop(key,None)

我在thread2中遇到错误'RuntimeError:字典在迭代期间改变了大小',因为thread1同时工作。**如何使用GIL锁定thread2中的dictDemo字典?**或者GIL只能用于线程?还是有办法锁定字典,以便一次限制2个线程使用对象?

1 个答案:

答案 0 :(得分:4)

使用GIL保护您的Python代码并不安全 - 很难知道何时要松开GIL。 GIL用于保护解释器,而不是您的代码。

您需要序列化字典的使用,最简单的方法是使用Lock对象。

from threading import Lock
dLock = Lock()

在thread1中:

dLock.acquire()
dictDemo[callid]=val
dLock.release()
在thread2中

dLock.acquire()
for key in dictDemo.keys():   
     #if key in dictDemo:   <-- not required!
     dictDemo.pop(key,None)
dLock.release()

顺便说一下,dictDemo.clear()如果要做的就是清除字典,可能会对此有用。