4

我正在尝试使用该模块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__方法无效。我可以以某种方式强制/解决这个问题吗?

4

1 回答 1

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)
于 2013-01-14T19:24:17.940 回答