如何在当前进程中使用python.multiprocessing创建代理以传递给其他进程?

3 投票
1 回答
3858 浏览
提问于 2025-04-15 14:30

我正在使用Python的multiprocessing库。我知道如何定义从函数返回的对象应该创建代理,但我想把当前进程中的对象变成代理,这样我就可以把它们作为参数传递。

比如,运行下面这个脚本:

from multiprocessing import current_process
from multiprocessing.managers import BaseManager

class ProxyTest(object):
    def call_a(self):
        print 'A called in %s' % current_process()

    def call_b(self, proxy_test):
        print 'B called in %s' % current_process()
        proxy_test.call_a()

class MyManager(BaseManager):
    pass

MyManager.register('proxy_test', ProxyTest)

if __name__ == '__main__':
    manager = MyManager()
    manager.start()

    pt1 = ProxyTest()
    pt2 = manager.proxy_test()

    pt1.call_a()
    pt2.call_a()

    pt1.call_b(pt2)
    pt2.call_b(pt1)

... 我得到了以下输出 ...

A called in <_MainProcess(MainProcess, started)>
A called in <Process(MyManager-1, started)>
B called in <_MainProcess(MainProcess, started)>
A called in <Process(MyManager-1, started)>
B called in <Process(MyManager-1, started)>
A called in <Process(MyManager-1, started)>

... 但我希望最后一行输出来自_MainProcess

我可以创建另一个进程并从那里运行,但我想尽量减少进程之间需要传递的数据量。Manager对象的文档提到了一个serve_forever方法,但似乎不支持。有没有什么想法?有人知道吗?

1 个回答

1

你为什么说 serve_forever 不被支持呢?

manager = Mymanager()
s = manager.get_server()
s.serve_forever()

应该是可以工作的。

可以查看 managers.BaseManager.get_server 的文档,里面有官方的例子。

撰写回答