]> granicus.if.org Git - python/commitdiff
Issue 5177: use socket.SO_REUSEADDR on multiprocessing SocketManager sockets
authorJesse Noller <jnoller@gmail.com>
Mon, 30 Mar 2009 15:50:42 +0000 (15:50 +0000)
committerJesse Noller <jnoller@gmail.com>
Mon, 30 Mar 2009 15:50:42 +0000 (15:50 +0000)
Lib/multiprocessing/connection.py
Lib/test/test_multiprocessing.py
Misc/NEWS

index 1f0565852c3f0526b3b877da6f0bab1683a22647..59beaa0ae3a95cdf0c45394c7def76671123ce71 100644 (file)
@@ -214,6 +214,7 @@ class SocketListener(object):
     '''
     def __init__(self, address, family, backlog=1):
         self._socket = socket.socket(getattr(socket, family))
+        self._socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
         self._socket.bind(address)
         self._socket.listen(backlog)
         self._address = self._socket.getsockname()
index 8f34a1e0298e5ec7b7f01fdc1895b3aa65f1e67c..76bd3ed01326bcb141107783ad0ee5b84d40a62f 100644 (file)
@@ -1189,6 +1189,30 @@ class _TestRemoteManager(BaseTestCase):
         del queue
         manager.shutdown()
 
+class _TestManagerRestart(BaseTestCase):
+
+    def _putter(self, address, authkey):
+        manager = QueueManager(
+            address=address, authkey=authkey, serializer=SERIALIZER)
+        manager.connect()
+        queue = manager.get_queue()
+        queue.put('hello world')
+
+    def test_rapid_restart(self):
+        authkey = os.urandom(32)
+        manager = QueueManager(
+            address=('localhost', 9999), authkey=authkey, serializer=SERIALIZER)
+        manager.start()
+
+        p = self.Process(target=self._putter, args=(manager.address, authkey))
+        p.start()
+        queue = manager.get_queue()
+        self.assertEqual(queue.get(), 'hello world')
+        manager.shutdown()
+        manager = QueueManager(
+            address=('localhost', 9999), authkey=authkey, serializer=SERIALIZER)
+        manager.start()
+
 #
 #
 #
index c395d06fc6253d829b16a53e2233bd44a55f79d3..1de245895696da3ea3b8b597037da8ed4168b8b4 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -197,6 +197,10 @@ Core and Builtins
 Library
 -------
 
+- Issue #5177: Multiprocessing's SocketListener class now uses 
+  socket.SO_REUSEADDR on all connections so that the user no longer needs
+  to wait 120 seconds for the socket to expire.
+
 - Adjusted _tkinter to compile without warnings when WITH_THREAD is not
   defined (part of issue #5035).