mirror of https://github.com/python/cpython.git
Issue #6056: Make multiprocessing use setblocking(True) on the sockets it uses.
Original patch by J Derek Wilson.
This commit is contained in:
parent
46874ad367
commit
b15e622bb8
|
@ -497,6 +497,8 @@ def Pipe(duplex=True):
|
||||||
'''
|
'''
|
||||||
if duplex:
|
if duplex:
|
||||||
s1, s2 = socket.socketpair()
|
s1, s2 = socket.socketpair()
|
||||||
|
s1.setblocking(True)
|
||||||
|
s2.setblocking(True)
|
||||||
c1 = Connection(s1.detach())
|
c1 = Connection(s1.detach())
|
||||||
c2 = Connection(s2.detach())
|
c2 = Connection(s2.detach())
|
||||||
else:
|
else:
|
||||||
|
@ -561,6 +563,7 @@ def __init__(self, address, family, backlog=1):
|
||||||
if os.name == 'posix':
|
if os.name == 'posix':
|
||||||
self._socket.setsockopt(socket.SOL_SOCKET,
|
self._socket.setsockopt(socket.SOL_SOCKET,
|
||||||
socket.SO_REUSEADDR, 1)
|
socket.SO_REUSEADDR, 1)
|
||||||
|
self._socket.setblocking(True)
|
||||||
self._socket.bind(address)
|
self._socket.bind(address)
|
||||||
self._socket.listen(backlog)
|
self._socket.listen(backlog)
|
||||||
self._address = self._socket.getsockname()
|
self._address = self._socket.getsockname()
|
||||||
|
@ -579,6 +582,7 @@ def __init__(self, address, family, backlog=1):
|
||||||
|
|
||||||
def accept(self):
|
def accept(self):
|
||||||
s, self._last_accepted = self._socket.accept()
|
s, self._last_accepted = self._socket.accept()
|
||||||
|
s.setblocking(True)
|
||||||
return Connection(s.detach())
|
return Connection(s.detach())
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
|
@ -593,6 +597,7 @@ def SocketClient(address):
|
||||||
'''
|
'''
|
||||||
family = address_type(address)
|
family = address_type(address)
|
||||||
with socket.socket( getattr(socket, family) ) as s:
|
with socket.socket( getattr(socket, family) ) as s:
|
||||||
|
s.setblocking(True)
|
||||||
s.connect(address)
|
s.connect(address)
|
||||||
return Connection(s.detach())
|
return Connection(s.detach())
|
||||||
|
|
||||||
|
|
|
@ -3312,9 +3312,43 @@ def test_flags(self):
|
||||||
child_flags, grandchild_flags = json.loads(data.decode('ascii'))
|
child_flags, grandchild_flags = json.loads(data.decode('ascii'))
|
||||||
self.assertEqual(child_flags, grandchild_flags)
|
self.assertEqual(child_flags, grandchild_flags)
|
||||||
|
|
||||||
|
#
|
||||||
|
# Test interaction with socket timeouts - see Issue #6056
|
||||||
|
#
|
||||||
|
|
||||||
|
class TestTimeouts(unittest.TestCase):
|
||||||
|
@classmethod
|
||||||
|
def _test_timeout(cls, child, address):
|
||||||
|
time.sleep(1)
|
||||||
|
child.send(123)
|
||||||
|
child.close()
|
||||||
|
conn = multiprocessing.connection.Client(address)
|
||||||
|
conn.send(456)
|
||||||
|
conn.close()
|
||||||
|
|
||||||
|
def test_timeout(self):
|
||||||
|
old_timeout = socket.getdefaulttimeout()
|
||||||
|
try:
|
||||||
|
socket.setdefaulttimeout(0.1)
|
||||||
|
parent, child = multiprocessing.Pipe(duplex=True)
|
||||||
|
l = multiprocessing.connection.Listener(family='AF_INET')
|
||||||
|
p = multiprocessing.Process(target=self._test_timeout,
|
||||||
|
args=(child, l.address))
|
||||||
|
p.start()
|
||||||
|
child.close()
|
||||||
|
self.assertEqual(parent.recv(), 123)
|
||||||
|
parent.close()
|
||||||
|
conn = l.accept()
|
||||||
|
self.assertEqual(conn.recv(), 456)
|
||||||
|
conn.close()
|
||||||
|
l.close()
|
||||||
|
p.join(10)
|
||||||
|
finally:
|
||||||
|
socket.setdefaulttimeout(old_timeout)
|
||||||
|
|
||||||
testcases_other = [OtherTest, TestInvalidHandle, TestInitializers,
|
testcases_other = [OtherTest, TestInvalidHandle, TestInitializers,
|
||||||
TestStdinBadfiledescriptor, TestWait, TestInvalidFamily,
|
TestStdinBadfiledescriptor, TestWait, TestInvalidFamily,
|
||||||
TestFlags]
|
TestFlags, TestTimeouts]
|
||||||
|
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
|
|
@ -1130,6 +1130,7 @@ John Williams
|
||||||
Sue Williams
|
Sue Williams
|
||||||
Frank Willison
|
Frank Willison
|
||||||
Greg V. Wilson
|
Greg V. Wilson
|
||||||
|
J Derek Wilson
|
||||||
Jody Winston
|
Jody Winston
|
||||||
Collin Winter
|
Collin Winter
|
||||||
Dik Winter
|
Dik Winter
|
||||||
|
|
|
@ -55,6 +55,9 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #6056: Make multiprocessing use setblocking(True) on the
|
||||||
|
sockets it uses. Original patch by J Derek Wilson.
|
||||||
|
|
||||||
- Issue #15364: Fix sysconfig.get_config_var('srcdir') to be an
|
- Issue #15364: Fix sysconfig.get_config_var('srcdir') to be an
|
||||||
absolute path.
|
absolute path.
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue