Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python多处理共享队列目录_Python_Queue_Multiprocessing - Fatal编程技术网

python多处理共享队列目录

python多处理共享队列目录,python,queue,multiprocessing,Python,Queue,Multiprocessing,我试图在Python多处理中实现一个并行优先级队列。我使用的数据结构是队列的排序Dict。因此,要获取第一个元素,我只需获取最高优先级的密钥并返回与其关联的队列 我很难将其应用到多处理框架中。通过使用BaseProxy和BaseManager扩展sortedcontainers SortedAct类,我得到了一个共享的排序字典对象。但是,我不确定如何设置排序字典中的multiprocessing.Queue对象 以下是我目前掌握的情况: from multiprocessing import P

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

我很难将其应用到多处理框架中。通过使用BaseProxy和BaseManager扩展sortedcontainers SortedAct类,我得到了一个共享的排序字典对象。但是,我不确定如何设置排序字典中的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

相当确定的是,这是因为我正在尝试初始化我的
\uuuu setitem\uuuu
中的一个管理器,以初始化进程安全队列。不清楚该如何做/如果可能的话

您找到解决方案了吗?您找到解决方案了吗?