繁体   English   中英

Python多处理传递参考

[英]Python multiprocessing passing reference

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

代理对象具有调用其引用对象的相应方法的方法(尽管并非引用对象的每个方法都一定可以通过代理使用)。 代理通常可以使用与其参照对象可以使用的大多数相同的方式使用

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

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

服务器:

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__方法无效。 我可以以某种方式强制/解决方法吗?

使用代理 在客户端上添加此类声明(以及导入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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM