【问题标题】:How could I use GIL for a dictionary in a multithreaded application?如何在多线程应用程序中将 GIL 用于字典?
【发布时间】:2015-03-27 12:29:42
【问题描述】:

我在一个线程中迭代一个字典时遇到了错误'RuntimeError: dictionary changed size during iteration',该字典被插入到Python 2.7的另一个线程中。我发现通过使用全局解释器锁,我们可以在多线程情况下锁定一个对象。

      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 只能用于线程?或者有没有办法锁定字典,以便一次限制 2 个线程使用对象?

【问题讨论】:

  • 可以使用threading.Lock对象。

标签: python multithreading dictionary gil


【解决方案1】:

使用 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() 在这里可能会很有用。

【讨论】:

    猜你喜欢
    • 2015-03-13
    • 1970-01-01
    • 1970-01-01
    • 2014-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-07
    • 2018-04-28
    相关资源
    最近更新 更多