diff --git a/Lib/multiprocessing/connection.py b/Lib/multiprocessing/connection.py index 8b2be19cedd..dc31f2f62b2 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 9ec0be2a70f..d973b44b73f 100644 --- a/Lib/test/test_multiprocessing.py +++ b/Lib/test/test_multiprocessing.py @@ -2102,6 +2102,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) @@ -3251,6 +3252,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, @@ -3274,7 +3276,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) @@ -3283,7 +3285,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 702a30e42ba..88a73e47905 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -200,6 +200,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.