通过multiprocessing.queue发送字典会发生变更吗?

4 投票
1 回答
938 浏览
提问于 2025-04-15 21:41

我有一个设置,我通过一个 multiprocessing.queue 发送一个字典,然后对它进行一些操作。可是我遇到了一个奇怪的错误,提示“在遍历字典时字典的大小发生了变化”,但我并没有对字典做任何修改。以下是错误的追踪信息,虽然这并没有太大帮助:

Traceback (most recent call last):
  File "/usr/lib/python2.6/multiprocessing/queues.py", line 242, in _feed
    send(obj)
RuntimeError: dictionary changed size during iteration

于是我尝试把字典换成一个不可变字典,想看看到底是在哪个地方被修改了。以下是我得到的追踪信息:

Traceback (most recent call last):
  File "/home/jason/src/interface_dev/jiva_interface/jiva_interface/delta.py", line 54, in main
    msg = self.recv()
  File "/home/jason/src/interface_dev/jiva_interface/jiva_interface/process/__init__.py", line 65, in recv
    return self.inqueue.get(timeout=timeout)
  File "/usr/lib/python2.6/multiprocessing/queues.py", line 91, in get
    res = self._recv()
  File "build/bdist.linux-i686/egg/pysistence/persistent_dict.py", line 22, in not_implemented_method
    raise NotImplementedError, 'Cannot set values in a PDict'
NotImplementedError: Cannot set values in a PDict

这有点奇怪,因为就我所知,我只是从队列中获取字典,并没有做其他操作。有人能帮我解释一下这是怎么回事吗?

1 个回答

2

最近修复了一个错误,这个错误是关于垃圾回收的。垃圾回收是用来清理不再使用的内存的,有时候它会改变一个字典的大小,而这个字典里面包含了弱引用。弱引用是一种特殊的引用方式,它不会阻止对象被垃圾回收。如果字典的大小在遍历的时候发生了变化,就会出现“字典在迭代过程中大小改变”的错误。我不确定这是否是你遇到的问题,但 multiprocessing 这个包确实使用了弱引用。

你可以查看这个链接了解更多信息:http://bugs.python.org/issue7105

撰写回答