Commit 45d61a34 authored by Antoine Pitrou's avatar Antoine Pitrou

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.
........
parent c3b0757b
...@@ -27,6 +27,8 @@ from multiprocessing.forking import duplicate, close ...@@ -27,6 +27,8 @@ from multiprocessing.forking import duplicate, close
# #
BUFSIZE = 8192 BUFSIZE = 8192
# A very generous timeout when it comes to local connections...
CONNECTION_TIMEOUT = 20.
_mmap_counter = itertools.count() _mmap_counter = itertools.count()
...@@ -41,6 +43,13 @@ if sys.platform == 'win32': ...@@ -41,6 +43,13 @@ if sys.platform == 'win32':
default_family = 'AF_PIPE' default_family = 'AF_PIPE'
families += ['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): ...@@ -247,12 +256,13 @@ def SocketClient(address):
''' '''
family = address_type(address) family = address_type(address)
s = socket.socket( getattr(socket, family) ) s = socket.socket( getattr(socket, family) )
t = _init_timeout()
while 1: while 1:
try: try:
s.connect(address) s.connect(address)
except socket.error as e: 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) debug('failed to connect to address %s', address)
raise raise
time.sleep(0.01) time.sleep(0.01)
...@@ -322,6 +332,7 @@ if sys.platform == 'win32': ...@@ -322,6 +332,7 @@ if sys.platform == 'win32':
''' '''
Return a connection object connected to the pipe given by `address` Return a connection object connected to the pipe given by `address`
''' '''
t = _init_timeout()
while 1: while 1:
try: try:
win32.WaitNamedPipe(address, 1000) win32.WaitNamedPipe(address, 1000)
...@@ -331,7 +342,7 @@ if sys.platform == 'win32': ...@@ -331,7 +342,7 @@ if sys.platform == 'win32':
) )
except WindowsError as e: except WindowsError as e:
if e.args[0] not in (win32.ERROR_SEM_TIMEOUT, if e.args[0] not in (win32.ERROR_SEM_TIMEOUT,
win32.ERROR_PIPE_BUSY): win32.ERROR_PIPE_BUSY) or _check_timeout(t):
raise raise
else: else:
break break
......
...@@ -123,6 +123,11 @@ C-API ...@@ -123,6 +123,11 @@ C-API
Library 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 - Issue #7197: Allow unittest.TextTestRunner objects to be pickled and
unpickled. This fixes crashes under Windows when trying to run unpickled. This fixes crashes under Windows when trying to run
test_multiprocessing in verbose mode. test_multiprocessing in verbose mode.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment