summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGiampaolo Rodola' <g.rodola@gmail.com>2012-12-31 16:38:17 (GMT)
committerGiampaolo Rodola' <g.rodola@gmail.com>2012-12-31 16:38:17 (GMT)
commit5051ca887c82506a9dcf8b71e0e6890f9e0e1589 (patch)
tree58ae10a84a90f811946e5483ac5fb14e8c4593f5
parent0210194d48569ce136bad4d324ade03767356905 (diff)
parent5e844c8052d13202261c2eb95f07802615c66921 (diff)
downloadcpython-5051ca887c82506a9dcf8b71e0e6890f9e0e1589.zip
cpython-5051ca887c82506a9dcf8b71e0e6890f9e0e1589.tar.gz
cpython-5051ca887c82506a9dcf8b71e0e6890f9e0e1589.tar.bz2
Fix issue 10527: make multiprocessing use poll() instead of select() if available.
-rw-r--r--Lib/multiprocessing/connection.py21
-rw-r--r--Lib/test/test_multiprocessing.py6
-rw-r--r--Misc/NEWS2
3 files changed, 27 insertions, 2 deletions
diff --git a/Lib/multiprocessing/connection.py b/Lib/multiprocessing/connection.py
index fbbd5d9..2ae8a81 100644
--- a/Lib/multiprocessing/connection.py
+++ b/Lib/multiprocessing/connection.py
@@ -509,6 +509,27 @@ if sys.platform != 'win32':
return c1, c2
else:
+ if hasattr(select, 'poll'):
+ def _poll(fds, timeout):
+ if timeout is not None:
+ timeout = int(timeout) * 1000 # timeout is in milliseconds
+ fd_map = {}
+ pollster = select.poll()
+ for fd in fds:
+ pollster.register(fd, select.POLLIN)
+ if hasattr(fd, 'fileno'):
+ fd_map[fd.fileno()] = fd
+ else:
+ fd_map[fd] = fd
+ ls = []
+ for fd, event in pollster.poll(timeout):
+ if event & select.POLLNVAL:
+ raise ValueError('invalid file descriptor %i' % fd)
+ ls.append(fd_map[fd])
+ return ls
+ else:
+ def _poll(fds, timeout):
+ return select.select(fds, [], [], timeout)[0]
def Pipe(duplex=True):
'''
diff --git a/Lib/test/test_multiprocessing.py b/Lib/test/test_multiprocessing.py
index b2a964c..533dbac 100644
--- a/Lib/test/test_multiprocessing.py
+++ b/Lib/test/test_multiprocessing.py
@@ -2127,6 +2127,7 @@ class _TestConnection(BaseTestCase):
self.assertTimingAlmostEqual(poll.elapsed, TIMEOUT1)
conn.send(None)
+ time.sleep(.1)
self.assertEqual(poll(TIMEOUT1), True)
self.assertTimingAlmostEqual(poll.elapsed, 0)
@@ -3232,6 +3233,7 @@ class TestWait(unittest.TestCase):
from multiprocessing.connection import wait
expected = 3
+ sorted_ = lambda l: sorted(l, key=lambda x: isinstance(x, int))
sem = multiprocessing.Semaphore(0)
a, b = multiprocessing.Pipe()
p = multiprocessing.Process(target=self.signal_and_sleep,
@@ -3255,7 +3257,7 @@ class TestWait(unittest.TestCase):
res = wait([a, p.sentinel, b], 20)
delta = time.time() - start
- self.assertEqual(res, [p.sentinel, b])
+ self.assertEqual(sorted_(res), sorted_([p.sentinel, b]))
self.assertLess(delta, 0.4)
b.send(None)
@@ -3264,7 +3266,7 @@ class TestWait(unittest.TestCase):
res = wait([a, p.sentinel, b], 20)
delta = time.time() - start
- self.assertEqual(res, [a, p.sentinel, b])
+ self.assertEqual(sorted_(res), sorted_([a, p.sentinel, b]))
self.assertLess(delta, 0.4)
p.terminate()
diff --git a/Misc/NEWS b/Misc/NEWS
index c2bfa00..c2c1c33 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -124,6 +124,8 @@ Core and Builtins
Library
-------
+- Issue 10527: make multiprocessing use poll() instead of select() if available.
+
- Issue #16688: Fix backreferences did make case-insensitive regex fail on
non-ASCII strings. Patch by Matthew Barnett.