【问题标题】:Python: Given 2 processes A and B, call a function in A from BPython:给定 2 个进程 A 和 B,从 B 调用 A 中的函数
【发布时间】:2013-03-04 14:11:16
【问题描述】:

基于:http://docs.python.org/2/library/multiprocessing.html#managers 我正在重写一个示例,将其拆分为 2 个进程,一个客户端和一个服务器。就是如下代码:

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 相同的级别,而不是在另一个类中,我如何在 A 中调用这些函数乙?

【问题讨论】:

  • 你需要查看消息传递...

标签: python python-2.7 multiprocessing shared-memory python-multiprocessing


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-04-11
    • 1970-01-01
    • 2016-05-04
    • 2020-09-30
    • 2021-11-10
    • 1970-01-01
    相关资源
    最近更新 更多