[Python-checkins] r71041 - in python/trunk: Doc/library/multiprocessing.rst Lib/multiprocessing/managers.py Lib/multiprocessing/pool.py Lib/test/test_multiprocessing.py Misc/NEWS

jesse.noller python-checkins at python.org
Thu Apr 2 07:17:27 CEST 2009


Author: jesse.noller
Date: Thu Apr 2 07:17:26 2009
New Revision: 71041
Log:
Add custom initializer argument to multiprocess.Manager*, courtesy of lekma
Modified:
 python/trunk/Doc/library/multiprocessing.rst
 python/trunk/Lib/multiprocessing/managers.py
 python/trunk/Lib/multiprocessing/pool.py
 python/trunk/Lib/test/test_multiprocessing.py
 python/trunk/Misc/NEWS
Modified: python/trunk/Doc/library/multiprocessing.rst
==============================================================================
--- python/trunk/Doc/library/multiprocessing.rst	(original)
+++ python/trunk/Doc/library/multiprocessing.rst	Thu Apr 2 07:17:26 2009
@@ -1130,9 +1130,10 @@
 ``current_process().authkey``. Otherwise *authkey* is used and it
 must be a string.
 
- .. method:: start()
+ .. method:: start([initializer[, initargs]])
 
- Start a subprocess to start the manager.
+ Start a subprocess to start the manager. If *initializer* is not ``None``
+ then the subprocess will call ``initializer(*initargs)`` when it starts.
 
 .. method:: serve_forever()
 
Modified: python/trunk/Lib/multiprocessing/managers.py
==============================================================================
--- python/trunk/Lib/multiprocessing/managers.py	(original)
+++ python/trunk/Lib/multiprocessing/managers.py	Thu Apr 2 07:17:26 2009
@@ -475,12 +475,15 @@
 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 @@
 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 @@
 )
 
 @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)
 
Modified: python/trunk/Lib/multiprocessing/pool.py
==============================================================================
--- python/trunk/Lib/multiprocessing/pool.py	(original)
+++ python/trunk/Lib/multiprocessing/pool.py	Thu Apr 2 07:17:26 2009
@@ -92,6 +92,9 @@
 except NotImplementedError:
 processes = 1
 
+ if initializer is not None and not hasattr(initializer, '__call__'):
+ raise TypeError('initializer must be a callable')
+
 self._pool = []
 for i in range(processes):
 w = self.Process(
Modified: python/trunk/Lib/test/test_multiprocessing.py
==============================================================================
--- python/trunk/Lib/test/test_multiprocessing.py	(original)
+++ python/trunk/Lib/test/test_multiprocessing.py	Thu Apr 2 07:17:26 2009
@@ -1831,7 +1831,37 @@
 multiprocessing.connection.answer_challenge,
 _FakeConnection(), b'abc')
 
-testcases_other = [OtherTest, TestInvalidHandle]
+#
+# Test Manager.start()/Pool.__init__() initializer feature - see issue 5585
+#
+
+def initializer(ns):
+ ns.test += 1
+
+class TestInitializers(unittest.TestCase):
+ def setUp(self):
+ self.mgr = multiprocessing.Manager()
+ self.ns = self.mgr.Namespace()
+ self.ns.test = 0
+
+ def tearDown(self):
+ self.mgr.shutdown()
+
+ def test_manager_initializer(self):
+ m = multiprocessing.managers.SyncManager()
+ self.assertRaises(TypeError, m.start, 1)
+ m.start(initializer, (self.ns,))
+ self.assertEqual(self.ns.test, 1)
+ m.shutdown()
+
+ def test_pool_initializer(self):
+ self.assertRaises(TypeError, multiprocessing.Pool, initializer=1)
+ p = multiprocessing.Pool(1, initializer, (self.ns,))
+ p.close()
+ p.join()
+ self.assertEqual(self.ns.test, 1)
+
+testcases_other = [OtherTest, TestInvalidHandle, TestInitializers]
 
 #
 #
Modified: python/trunk/Misc/NEWS
==============================================================================
--- python/trunk/Misc/NEWS	(original)
+++ python/trunk/Misc/NEWS	Thu Apr 2 07:17:26 2009
@@ -202,6 +202,9 @@
 Library
 -------
 
+- Issue 5585: Add the ability to call an initializer to mulitiprocessing.manager
+ so that users can install custonm handlers/etc.
+
 - Issue 3551: Patch multiprocessing to raise a proper exception if the size of the
 object when writefile is called causes a ERROR_NO_SYSTEM_RESOURCES. Added docs
 to note the limitation


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /