Я использую библиотеку multiprocessing
в Python. Я могу понять, как определить, что объекты возвращены из функций должны быть созданы прокси, но я хотел бы, чтобы объекты в текущем процессе превращались в прокси, поэтому я могу передавать их как параметры.С 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
, но он, похоже, не поддерживается. Есть идеи? Кто-нибудь знает?
Документы говорят, что serve_forever принадлежит объекту BaseManager, когда на самом деле объект Server, возвращаемый get_server, является владельцем функции serve_forever! – manifest
Менеджер возвратил наследуемые от BaseManager, конечно – drAlberT