2015-10-04 97 views
4

我有一些多進程代碼,我想在進程中共享嵌套字典。字典永遠不會被進程修改;剛剛閱讀。嘗試訪問嵌套Manager.dict中的鍵值時發生KeyError

在最簡單的形式,有問題的代碼如下:

from multiprocessing import Manager 

class MyClass(object): 

    def __init__(self): 
     self.manager = Manager() 
     self.delays = self.manager.dict({}) 

    def foo(self, types, keys): 
     for type in types: 
      self.delays[type] = self.manager.dict({}) 

      for key in keys: 
       self.delays[type][key] = 0 

       print("The delay is " + str(self.delays[type][key])) 

我在print語句得到一個KeyError在那裏說,我使用的鍵不存在。我不確定爲什麼會發生這種情況,因爲我只是將密鑰插入字典中。當我將其改爲正規字典時,問題就會消失。

+0

有沒有可能發佈'Manager'類的相關部分?例如'Manager.dict()'和一個普通的老Python字典之間有什麼區別? – bakkal

+0

'Manager'來自['multiprocessing'](https://docs.python.org/3/library/multiprocessing.html)模塊。 –

+1

知道它,並編輯,以防萬一別人有相同的問題:) – bakkal

回答

3

在此基礎上answer到一個相關的問題,您可以使用Manager.list附加的字典,然後使用該字典的引用:

from multiprocessing import Manager 
class MyClass(object): 

    def __init__(self): 
     self.manager = Manager() 
     self.l = self.manager.list() 
     self.l.append({}) 
     self.delays = self.l[0] 

    def foo(self, types, keys): 
     for type in types: 
      self.delays[type] = self.manager.dict() 
      for key in keys: 
       self.delays[type].setdefault(key, 0) 
       print("The delay is {}".format(self.delays[type][key])) 
相關問題