2

基于:http://docs.python.org/2/library/multiprocessing.html#managers我正在重写一个要在两个进程中分裂的示例,即客户机和服务器。这是下面的代码:Python:给定2个进程A和B,从B调用A中的函数

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中调用这些函数?

+1

您需要查看消息传递... – 2013-03-15 18:31:26

回答

2

首先,您应该将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() 
相关问题