3
考慮下面的服務器代碼:類型錯誤:自動代理對象不是可迭代 - 多處理
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__')
應我做了什麼s ^同類?有誰能給我一個例子,並向我解釋這是如何工作的?
更新
澄清:假設我添加的類別:
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
我想我解決了這個問題:
要點是要獲得真正的價值:
for i in m.solver(args[1])._getvalue():
print i
天哪!我不確定這是正確的答案還是隻是一個解決方法...