簡體   English   中英

Python 多處理隊列酸洗錯誤

[英]Python multiprocessing Queues pickling error

我有以下 class:

class MDP(object):

    def __init__(self, level, state_var):
        self.state_var = state_var
        self.level = level
        ...
   
    def __repr__(self):
       return "level {} var {}".format(self.level, self.state_var)

    def __eq__(self, other):
        return self.level == other.level and self.state_var == other.state_var

    def __hash__(self):
        return hash((self.level,) + self.state_var)

    def __lt__(self, other):
        return self.state_var < other.state_var
    ...

我的 GUI 有另一個 class,如下所示:

class GUI:
    ...
    self.queue = multiprocessing.Queue()
    self.process = multiprocessing.Process(target=self.start, args=(self.queue,))
    self.process.start()

    def start(self, queue):
        ...
        pygame.init()
        ...
        while self.run:
            clock.tick(Consts.FPS)

            if not queue.empty():
                event = queue.get()

            self.container.render()
            pygame.display.update()

        queue.close()
        pygame.quit()
        sys.exit()
    
    def render_q_values(self, q_values):
        self.queue.put(Event(EventType.QVAL, q_values))

事件很簡單,看起來像這樣:

class Event():
    def __init__(self, kind, data):
        self.kind = kind
        self.data = data

當我調用gui.render_q_values(q_values)時,其中q_values是一個字典,其中鍵是MDP對象,值是整數,我在event = queue.get()行收到以下錯誤:

event = queue.get()

File "/.../python3.6/multiprocessing/queues.py", line 113, in get
    return _ForkingPickler.loads(res)
File ".../mdp.py", line 50, in __eq__
    return self.level == other.level and self.state_var == other.state_var
AttributeError: 'MDP' object has no attribute 'level'

我的 MDP 對象是可散列的,並且所有這些屬性都已初始化,我將它們放在集合和字典中,但是當我嘗試使用多處理模塊將它們放入隊列時,我得到了這類錯誤。 主要問題似乎是多處理模塊無法腌制我的 MDP 對象,有什么想法嗎?

此錯誤實際上與多處理模塊無關,而與我在 MDP object 中定義相等和 hash 函數的方式有關: 無法使用遞歸引用腌制對象

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM