我在线程中迭代字典时遇到错误'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()
在这里可能很有用。