from multiprocessing.managers import MakeProxyType, BaseManager import sys class Child(object): def __init__(self, name, age): self.name = name self.age = age def say_happy_birthday(self): print 'happy birthday {0}'.format(self.age) class Parent(object): def __init__(self): self.children = {} def get_child(self, childname): return self.children[childname] def add_child(self, childname, age): self.children[childname] = Child(childname, age) ParentProxy = MakeProxyType('ParentProxy', ('get_child', 'add_child')) ParentProxy._method_to_typeid_ = {'get_child' : 'Child'} ChildProxy = MakeProxyType('ChildProxy', ('say_happy_birthday',)) class ParentManager(BaseManager): pass ParentManager.register('Parent', proxytype=ParentProxy, create_method=False) ParentManager.register('Child', proxytype=ChildProxy, create_method=False) def create_manager_server(address='', port=42000, authkey='familytree'): manager = ParentManager(address=(address, port), authkey=authkey) manager._parent = Parent() manager.register('parent', callable=lambda: manager._parent, proxytype=ParentProxy) return manager def connect_to_remote_manager(address, port=42000, authkey='familytree'): manager = ParentManager(address=(address, port), authkey=authkey) manager.register('parent', proxytype=ParentProxy) manager.connect() return manager if __name__ == '__main__': run = 'server' if len(sys.argv) == 2: run = 'client' address = sys.argv[1] if run == 'server': m = create_manager_server() m.get_server().serve_forever() else: m = connect_to_remote_manager(address) m.connect() parent = m.parent() parent.add_child('sam', 8) parent.add_child('bob', 4) child = parent.get_child('sam') child.say_happy_birthday()