[英]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.