4

モジュールQueueを使用してプロセス間でカスタムを渡そうとしています。multiprocessing問題は、すべてのメソッドが反対側に届いていないことです。ドキュメントによると。

プロキシ オブジェクトには、その参照対象の対応するメソッドを呼び出すメソッドがあります (ただし、参照対象のすべてのメソッドが必ずしもプロキシを介して使用できるわけではありません)。プロキシは、通常、その参照対象が使用できる方法とほとんど同じ方法で使用できます。

しかし、その理由や回避方法については言及されていません。誰かがこれを行う方法を知っているかどうか疑問に思っています。

これが私がやろうとしていることの小さな例です。

サーバ:

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__メソッドは機能しません。これを何らかの方法で強制/回避できますか?

4

1 に答える 1

2

プロキシを使用します。クライアントで、このクラス宣言を追加します(インポートとともに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)
于 2013-01-14T19:24:17.940 に答える