Add custom initializer argument to multiprocess.Manager*, courtesy of lekma

This commit is contained in:
Jesse Noller 2009-04-02 05:17:26 +00:00
parent d56bab47f1
commit 7152f6d915
5 changed files with 50 additions and 6 deletions

View file

@ -475,12 +475,15 @@ class BaseManager(object):
dispatch(conn, None, 'dummy')
self._state.value = State.STARTED
def start(self):
def start(self, initializer=None, initargs=()):
'''
Spawn a server process for this manager object
'''
assert self._state.value == State.INITIAL
if initializer is not None and not hasattr(initializer, '__call__'):
raise TypeError('initializer must be a callable')
# pipe over which we will retrieve address of server
reader, writer = connection.Pipe(duplex=False)
@ -488,7 +491,7 @@ class BaseManager(object):
self._process = Process(
target=type(self)._run_server,
args=(self._registry, self._address, self._authkey,
self._serializer, writer),
self._serializer, writer, initializer, initargs),
)
ident = ':'.join(str(i) for i in self._process._identity)
self._process.name = type(self).__name__ + '-' + ident
@ -509,10 +512,14 @@ class BaseManager(object):
)
@classmethod
def _run_server(cls, registry, address, authkey, serializer, writer):
def _run_server(cls, registry, address, authkey, serializer, writer,
initializer=None, initargs=()):
'''
Create a server, report its address and run it
'''
if initializer is not None:
initializer(*initargs)
# create server
server = cls._Server(registry, address, authkey, serializer)