gpt4 book ai didi

python - 类型错误 : AutoProxy object is not iterable - multiprocessing

转载 作者:太空宇宙 更新时间:2023-11-03 12:10:02 27 4
gpt4 key购买 nike

考虑以下服务器代码:

from multiprocessing.managers import BaseManager, BaseProxy

def baz(aa) :
print "aaa"
l = []
for i in range(3) :
l.append(aa)
return l

class SolverManager(BaseManager): pass

manager = SolverManager(address=('127.0.0.1', 50000), authkey='mpm')
manager.register('solver', baz)

server = manager.get_server()
server.serve_forever()

和关联的客户端:

import sys
from multiprocessing.managers import BaseManager, BaseProxy

class SolverManager(BaseManager): pass

def main(args) :
SolverManager.register('solver')
m = SolverManager(address=('127.0.0.1', 50000), authkey='mpm')
m.connect()

for i in m.solver(args[1]):
print i

if __name__ == '__main__':
sys.exit(main(sys.argv))

我想我在这里遗漏了一些重要的东西。我的猜测是我必须子类化 BaseProxy 类以提供可迭代对象,但到目前为止我还没有成功。

当我运行客户端时出现此错误:

Traceback (most recent call last):
File "mpmproxy.py", line 17, in <module>
sys.exit(main(sys.argv))
File "mpmproxy.py", line 13, in main
for i in m.solver(args[1]):
TypeError: 'AutoProxy[solver]' object is not iterable

但是如果我尝试打印它,列表就在那里......也许它也与数据在客户端和服务器之间序列化的方式有关......

在文档中有一个类似的案例(使用生成器),他们使用以下类来访问数据:

class GeneratorProxy(BaseProxy):
_exposed_ = ('next', '__next__')
def __iter__(self):
return self
def next(self):
return self._callmethod('next')
def __next__(self):
return self._callmethod('__next__')

我应该做类似的事情吗?谁能给我一个例子并向我解释这是如何工作的?

更新

澄清一下:假设我添加了类:

class IteratorProxy(BaseProxy):
def __iter__(self):
print self
return self

然后在客户端中我将函数注册为

SolverManager.register('solver', proxytype=IteratorProxy)

我得到的错误是:

$python mpmproxy.py test
['test', 'test', 'test']
Traceback (most recent call last):
File "mpmproxy.py", line 22, in <module>
sys.exit(main(sys.argv))
File "mpmproxy.py", line 18, in main
for i in m.solver(args[1]):
TypeError: iter() returned non-iterator of type 'IteratorProxy'

我觉得我在这里遗漏了一些愚蠢的东西......

更新 2

我想我解决了这个问题:

重点是获得真正的值(value):

for i in m.solver(args[1])._getvalue():
print i

天啊!!!我不确定这是正确的答案还是只是一种解决方法...

最佳答案

确实,要实现可迭代,您的类需要定义 BaseProxy 定义的 __iter__ 方法,所以我想继承是正确的方法!

关于python - 类型错误 : AutoProxy object is not iterable - multiprocessing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6029530/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com