summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2009-11-13 22:35:18 (GMT)
committerAntoine Pitrou <solipsis@pitrou.net>2009-11-13 22:35:18 (GMT)
commit45d61a341d8e5a71ae9bb1a3923646ea2d7d127e (patch)
treea05cf2aaddb8d5ef98866d44514537caf15a5e34
parentc3b0757b026955e4421e49ca841b9350b4faebc4 (diff)
downloadcpython-45d61a341d8e5a71ae9bb1a3923646ea2d7d127e.zip
cpython-45d61a341d8e5a71ae9bb1a3923646ea2d7d127e.tar.gz
cpython-45d61a341d8e5a71ae9bb1a3923646ea2d7d127e.tar.bz2
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. ........
-rw-r--r--Lib/multiprocessing/connection.py15
-rw-r--r--Misc/NEWS5
2 files changed, 18 insertions, 2 deletions
diff --git a/Lib/multiprocessing/connection.py b/Lib/multiprocessing/connection.py
index 5e94fed..b632e93 100644
--- a/Lib/multiprocessing/connection.py
+++ b/Lib/multiprocessing/connection.py
@@ -27,6 +27,8 @@ from multiprocessing.forking import duplicate, close
#
BUFSIZE = 8192
+# A very generous timeout when it comes to local connections...
+CONNECTION_TIMEOUT = 20.
_mmap_counter = itertools.count()
@@ -41,6 +43,13 @@ if sys.platform == 'win32':
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 @@ def SocketClient(address):
'''
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 @@ if sys.platform == 'win32':
'''
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 @@ if sys.platform == 'win32':
)
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
diff --git a/Misc/NEWS b/Misc/NEWS
index a7b570c..43639a6 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -123,6 +123,11 @@ C-API
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.