我如何在多线程应用程序中将 GIL 用于字典?
How could I use GIL for a dictionary in a multithreaded application?
我在线程中遍历字典时遇到错误 'RuntimeError: dictionary changed size during iteration',该字典正在插入到 [=23= 中的另一个线程中] 2.7.我发现通过使用全局解释器锁,我们可以在多线程的情况下锁定一个对象。
In thread1:
dictDemo[callid]=val
in thread2:
for key in dictDemo:
if key in dictDemo:
dictDemo.pop(key,None)
由于线程1同时工作,我在thread2中遇到错误'RuntimeError: dictionary changed size during iteration'。**如何使用GIL锁定thread2中的dictDemo字典?* *或者GIL只能用于线程?或者有没有办法锁定字典以便限制2个线程同时使用对象?
使用 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()
在这里可能会有用。
我在线程中遍历字典时遇到错误 'RuntimeError: dictionary changed size during iteration',该字典正在插入到 [=23= 中的另一个线程中] 2.7.我发现通过使用全局解释器锁,我们可以在多线程的情况下锁定一个对象。
In thread1:
dictDemo[callid]=val
in thread2:
for key in dictDemo:
if key in dictDemo:
dictDemo.pop(key,None)
由于线程1同时工作,我在thread2中遇到错误'RuntimeError: dictionary changed size during iteration'。**如何使用GIL锁定thread2中的dictDemo字典?* *或者GIL只能用于线程?或者有没有办法锁定字典以便限制2个线程同时使用对象?
使用 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()
在这里可能会有用。