我試圖在使用multiprocessing
模塊的進程之間傳遞自定義Queue
。問題是我沒有把所有的方法都傳遞給對方。根據文檔。Python多處理傳遞參考
代理對象具有調用其對象的相應方法的方法(儘管並非指代的每個方法都必須通過代理可用)。代理人通常可以以與其所指對象相同的方式使用
但它沒有說明爲什麼或解決方法。我想知道是否有人知道這樣做的一種方式。
這是我想要做的一個小例子。
服務器:
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__
方法不適用。我可以強制/解決這個問題嗎?
也許你需要添加一個'暴露= [ '__ ITER __']'關鍵字參數給服務器中的'QueueManager.register()'調用。 – martineau