Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:给定两个进程A和B,从B调用A中的函数_Python_Python 2.7_Multiprocessing_Shared Memory_Python Multiprocessing - Fatal编程技术网

Python:给定两个进程A和B,从B调用A中的函数

Python:给定两个进程A和B,从B调用A中的函数,python,python-2.7,multiprocessing,shared-memory,python-multiprocessing,Python,Python 2.7,Multiprocessing,Shared Memory,Python Multiprocessing,基于:我正在重写一个示例,将其分为两个进程,一个客户端和一个服务器。代码如下: from multiprocessing.managers import BaseManager import multiprocessing class ManagerServer(multiprocessing.Process): def __init__(self): multiprocessing.Process.__init__(self) class MathsClass(object

基于:我正在重写一个示例,将其分为两个进程,一个客户端和一个服务器。代码如下:

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,其中A的函数定义在与init相同的级别,而不是在另一个类中,如何从B调用A中的这些函数?

首先,您应该将
MathsClass
中的
self
变量重命名为其他变量以避免冲突。在您的示例中,要访问
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()

您需要查看消息传递。。。