mirror of
https://github.com/python/cpython.git
synced 2024-11-30 05:15:14 +08:00
Merged revisions 76247 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/py3k ................ r76247 | antoine.pitrou | 2009-11-13 23:35:18 +0100 (ven., 13 nov. 2009) | 12 lines 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. ........ ................
This commit is contained in:
parent
ca15409195
commit
4def51567d
@ -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
|
||||
|
@ -40,6 +40,11 @@ Core and Builtins
|
||||
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 #7282: Fix a memory leak when an RLock was used in a thread other
|
||||
than those started through `threading.Thread` (for example, using
|
||||
`_thread.start_new_thread()`).
|
||||
|
Loading…
Reference in New Issue
Block a user