Python多处理传递引用

时间:2013-01-14 18:06:59

标签: python multiprocessing

我正在尝试使用Queue模块在​​进程之间传递自定义multiprocessing。问题是我没有把所有的方法都传到另一边。根据文件。

  

代理对象具有调用其引用对象的相应方法的方法(尽管并非所有引用对象的方法都必须通过代理可用)。代理通常可以以与其指示对象相同的大多数方式使用

但它没有说出原因或解决方法。我想知道是否有人知道这样做的方法。

以下是我正在尝试做的一个小例子。

服务器

from multiprocessing.managers import BaseManager
from Queue import Queue


class KeyHandler(Queue):

    def __init__(self, elements=[]):
        Queue.__init__(self)

        for element in elements:
            self.put(element)

    def __iter__(self):
        return iter(self.get, object())

    def __call__(self):
        return self


class QueueManager(BaseManager):
    pass

keyhandler = KeyHandler(range(10))


QueueManager.register('keyhandler', callable=keyhandler)
manager = QueueManager(address=('', 50000), authkey='foobar')
server  = manager.get_server()
server.serve_forever()

客户端:

from multiprocessing.managers import BaseManager


class QueueManager(BaseManager):
    pass


QueueManager.register('keyhandler')
manager = QueueManager(address=('', 50000), authkey='foobar')
manager.connect()

keyhandler = manager.keyhandler()

for elem in keyhandler:
    print elem

回溯:

Traceback (most recent call last):
  File "client2.py", line 14, in <module>
    for elem in keyhandler:
TypeError: 'AutoProxy[keyhandler]' object is not iterable

__call__方法有效,但__iter__方法却无效。我可以以某种方式强迫/解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

使用代理。在客户端添加此类声明(以及导入BaseProxy):

class KeyHandlerProxy(BaseProxy):
    _exposed_ = ('next', 'get')

    def __iter__(self):
        return self

    def next(self):
        o = self._callmethod('get')
        if object() == o:
            raise StopIteration
        return o

register(客户端)更改为:

QueueManager.register('keyhandler', proxytype=KeyHandlerProxy)