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() 
相關問題