我试图在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__
中初始化一个经理来初始化过程安全队列。不清楚如何做到这一点/如果可能