[Python-checkins] r76247 - in python/branches/py3k: Lib/multiprocessing/connection.py Misc/NEWS

antoine.pitrou python-checkins at python.org
Fri Nov 13 23:35:18 CET 2009


Author: antoine.pitrou
Date: Fri Nov 13 23:35:18 2009
New Revision: 76247

Log:
Merged revisions 76245 via svnmerge from 
svn+ssh://pythondev@svn.python.org/python/trunk

........
  r76245 | antoine.pitrou | 2009-11-13 23:31:18 +0100 (ven., 13 nov. 2009) | 6 lines
  
  Issue #7318: multiprocessing now uses a timeout when it fails to establish
  a connection with another process, rather than looping endlessly. The
  default timeout is 20 seconds, which should be amply sufficient for
  local connections.
........


Modified:
   python/branches/py3k/   (props changed)
   python/branches/py3k/Lib/multiprocessing/connection.py
   python/branches/py3k/Misc/NEWS

Modified: python/branches/py3k/Lib/multiprocessing/connection.py
==============================================================================
--- python/branches/py3k/Lib/multiprocessing/connection.py	(original)
+++ python/branches/py3k/Lib/multiprocessing/connection.py	Fri Nov 13 23:35:18 2009
@@ -27,6 +27,8 @@
 #
 
 BUFSIZE = 8192
+# A very generous timeout when it comes to local connections...
+CONNECTION_TIMEOUT = 20.
 
 _mmap_counter = itertools.count()
 
@@ -41,6 +43,13 @@
     default_family = 'AF_PIPE'
     families += ['AF_PIPE']
 
+
+def _init_timeout(timeout=CONNECTION_TIMEOUT):
+    return time.time() + timeout
+
+def _check_timeout(t):
+    return time.time() > t
+
 #
 #
 #
@@ -247,12 +256,13 @@
     '''
     family = address_type(address)
     s = socket.socket( getattr(socket, family) )
+    t = _init_timeout()
 
     while 1:
         try:
             s.connect(address)
         except socket.error as e:
-            if e.args[0] != errno.ECONNREFUSED: # connection refused
+            if e.args[0] != errno.ECONNREFUSED or _check_timeout(t):
                 debug('failed to connect to address %s', address)
                 raise
             time.sleep(0.01)
@@ -322,6 +332,7 @@
         '''
         Return a connection object connected to the pipe given by `address`
         '''
+        t = _init_timeout()
         while 1:
             try:
                 win32.WaitNamedPipe(address, 1000)
@@ -331,7 +342,7 @@
                     )
             except WindowsError as e:
                 if e.args[0] not in (win32.ERROR_SEM_TIMEOUT,
-                                     win32.ERROR_PIPE_BUSY):
+                                     win32.ERROR_PIPE_BUSY) or _check_timeout(t):
                     raise
             else:
                 break

Modified: python/branches/py3k/Misc/NEWS
==============================================================================
--- python/branches/py3k/Misc/NEWS	(original)
+++ python/branches/py3k/Misc/NEWS	Fri Nov 13 23:35:18 2009
@@ -123,6 +123,11 @@
 Library
 -------
 
+- Issue #7318: multiprocessing now uses a timeout when it fails to establish
+  a connection with another process, rather than looping endlessly. The
+  default timeout is 20 seconds, which should be amply sufficient for
+  local connections.
+
 - Issue #7197: Allow unittest.TextTestRunner objects to be pickled and
   unpickled. This fixes crashes under Windows when trying to run
   test_multiprocessing in verbose mode.


More information about the Python-checkins mailing list