通过multiprocessing.queue发送字典会发生变更吗?
我有一个设置,我通过一个 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