python多处理共享队列的dict

时间:2017-07-24 15:52:06

标签: python queue multiprocessing

我试图在Python多处理中实现并行优先级队列。我使用的数据结构是排序的排序字典。因此,为了得到第一个元素,我只获得最高优先级的密钥并返回与之关联的队列。

我无法将其融入多处理框架。我通过使用BaseProxy和BaseManager扩展sortedcontainers SortedDict类来获得共享的排序字典对象。但是,我不确定如何在排序字典中设置multiprocessing.Queue对象

这是我到目前为止所拥有的:

from multiprocessing import Process, Manager, Queue
from multiprocessing.managers import BaseManager, BaseProxy
from sortedcontainers import SortedDict

from multiprocessing.managers import BaseManager

class PriorityQueueClass(SortedDict):
    pass

class PriorityQueueProxy(BaseProxy):
    _exposed_ = ('__len__', '__setitem__', '__getitem__', 'peekitem')
    def __len__(self):
        return self._callmethod('__len__')

    def __getitem__(self, tuple):
        return self._callmethod('__getitem__', tuple)

    def __setitem__(self, tuple):
        key, item = tuple
        queue = Queue()
        queue.put(item)
        return self._callmethod('__setitem__', (key, queue))

    def peekitem(self, tuple=(0,)):
        return self._callmethod('peekitem', tuple)



class MyManager(BaseManager):
    pass

MyManager.register('PriorityQueue', PriorityQueueClass, PriorityQueueProxy)

if __name__ == '__main__':
    manager = MyManager()
    manager.start()
    pq = manager.PriorityQueue()
    pq.__setitem__((1, 2))
    pq.__setitem__((0, 2))
    pq.__getitem__(0)

引发了异常:

RuntimeError: Queue objects should only be shared between processes through inheritance

相当肯定这是因为我试图在我的__setitem__中初始化一个经理来初始化过程安全队列。不清楚如何做到这一点/如果可能

0 个答案:

没有答案