2013-01-14 43 views
4

我試圖在使用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__方法不適用。我可以強制/解決這個問題嗎?

+0

也許你需要添加一個'暴露= [ '__ ITER __']'關鍵字參數給服務器中的'QueueManager.register()'調用。 – martineau

回答

1

使用代理。在客戶端添加這個類聲明(連同進口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) 
+0

你不需要'_exposed_'字段 – kerim