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



我在线程中迭代字典时遇到错误'RuntimeError:dictionary在迭代过程中更改了大小',该字典正在插入Python 2.7中的另一个线程中。我发现通过使用全局Intrepreter Lock,我们可以在多线程情况下锁定对象。

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

我在thread2中遇到错误"RuntimeError:dictionary changed size during iteration",因为thread1在同一时间工作。**我如何使用GIL在thread2中锁定dictDemo字典**或者GIL只能用于线程?或者有没有一种方法可以锁定字典,从而一次通过两个线程限制对象的使用?

使用GIL来保护Python代码是不安全的——很难知道什么时候会丢失GIL。GIL是用来保护解释器的,而不是你的代码。

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

from threading import Lock
dLock = Lock()

线程内1:

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

线程内2:

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

顺便说一句,如果您只想清除字典,那么dictDemo.clear()在这里可能很有用。

最新更新