2009-09-22 9 views
2

Я использую библиотеку 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, но он, похоже, не поддерживается. Есть идеи? Кто-нибудь знает?

ответ

1

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

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

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

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

+0

Документы говорят, что serve_forever принадлежит объекту BaseManager, когда на самом деле объект Server, возвращаемый get_server, является владельцем функции serve_forever! – manifest

+0

Менеджер возвратил наследуемые от BaseManager, конечно – drAlberT

 Смежные вопросы

  • Нет связанных вопросов^_^