Изменяет ли это каким-либо образом отправку словаря через multiprocessing.queue? - PullRequest
4 голосов
/ 16 апреля 2010

У меня есть настройка, при которой я посылаю словарь через 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 голосов
/ 16 апреля 2010

Недавно была исправлена ​​ошибка, из-за которой сборщик мусора мог изменить размер словаря, содержащего слабые ссылки, и мог вызвать ошибку «изменен размер словаря во время итерации». Я не знаю, является ли это вашей проблемой, но многопроцессорный пакет использует слабые ссылки.

См. http://bugs.python.org/issue7105

...