2

に基づく:http ://docs.python.org/2/library/multiprocessing.html#managers私は、クライアントとサーバーの2つのプロセスに分割されるように例の1つを書き直しています。次のコードです。

from multiprocessing.managers import BaseManager
import multiprocessing

class ManagerServer(multiprocessing.Process):
def __init__(self):
    multiprocessing.Process.__init__(self)

    class MathsClass(object):
        def add(self, x, y):
            return x + y
        def mul(self, x, y):
            return x * y

    class MyManager(BaseManager): 
        pass

    MyManager.register('Maths', MathsClass)
    m = MyManager(address=('', 50000), authkey='abracadabra')
    self.s = m.get_server()

def run(self):
    self.s.serve_forever()

class ManagerClient(multiprocessing.Process):
def __init__(self):
    multiprocessing.Process.__init__(self)

    class MyManager(BaseManager): 
        pass

    MyManager.register('Maths')
    self.m = MyManager(address=('', 50000), authkey='abracadabra')


def run(self):
    self.m.connect()
    maths = self.m.Maths()
    print maths.add(4, 3)
    print maths.mul(7, 8)

if __name__ == "__main__":
ms = ManagerServer()
mc = ManagerClient()

ms.start()
mc.start()

このコードは機能し、クライアントからサーバーからクラスMathsClass内の関数を呼び出すことができます。

私が抱えている問題は、他の場所からのデータを処理しない、MathsClassで直接定義された関数に制限されていることです。

たとえば、ManagerServerで「addOuter(self、x、y)」という関数を定義し、クラスMathsClass内で、その関数addでaddOuter()を呼び出すと、それを見ることができず、存在しないと表示されます。 。

したがって、私の質問は、AとBの2つのプロセスがあり、Aが別のクラス内ではなくinitと同じレベルで定義された関数を持っている場合、BからAでこれらの関数を呼び出すにはどうすればよいですか?

4

1 に答える 1

2

まず、衝突を避けるために、self変数の名前を別の名前に変更する必要があります。MathsClass例の関数にアクセスするには、最初のパラメーターとして渡されManagerServerた のインスタンスを使用して、静的に呼び出す必要があります。ManagerServer良いことに、すでに として定義されているものがありselfます。これでうまくいくはずです:

from multiprocessing.managers import BaseManager
import multiprocessing

class ManagerServer(multiprocessing.Process):
    def __init__(self):
        multiprocessing.Process.__init__(self)

        class MathsClass(object):
            def add(innerSelf, x, y):
                return ManagerServer.addOuter(self, x, y)
            def mul(innerSelf, x, y):
                return x * y

    class MyManager(BaseManager): 
        pass

    def addOuter(self, x, y):
        return x + y

    MyManager.register('Maths', MathsClass)
    m = MyManager(address=('', 50000), authkey='abracadabra')
    self.s = m.get_server()

    def run(self):
        self.s.serve_forever()

class ManagerClient(multiprocessing.Process):
    def __init__(self):
        multiprocessing.Process.__init__(self)

        class MyManager(BaseManager): 
            pass

        MyManager.register('Maths')
        self.m = MyManager(address=('', 50000), authkey='abracadabra')


    def run(self):
        self.m.connect()
        maths = self.m.Maths()
        print maths.add(4, 3)
        print maths.mul(7, 8)

if __name__ == "__main__":
    ms = ManagerServer()
    mc = ManagerClient()

ms.start()
mc.start()
于 2013-03-15T18:43:53.283 に答える