С python.multiprocessing, как мне создать прокси в текущем процессе для передачи другим процессам? - PullRequest
2 голосов
/ 22 сентября 2009

Я использую библиотеку multiprocessing в Python. Я вижу, как определить, что для объектов , возвращаемых из функций, должны быть созданы прокси, но я бы хотел, чтобы объекты в текущем процессе превратились в прокси, чтобы я мог передавать их в качестве параметров.

Например, запустив следующий скрипт:

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 голос
/ 28 сентября 2009

Почему вы говорите, serve_forever не поддерживается?

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

должно работать.

См. Manager.BaseManager.get_server документ для официальных примеров.

...