我遇到错误'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个线程使用对象?
答案 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()
如果要做的就是清除字典,可能会对此有用。