diff options
author | Giampaolo Rodola' <g.rodola@gmail.com> | 2012-12-31 16:38:46 (GMT) |
---|---|---|
committer | Giampaolo Rodola' <g.rodola@gmail.com> | 2012-12-31 16:38:46 (GMT) |
commit | b4f39e85f2199bb9344e9b49feed3f6a45a318de (patch) | |
tree | d9afc3d38ed409698be1cb3e5a4aab1c5d568372 | |
parent | 8d518970ce30387db8168ea45402a871167562df (diff) | |
parent | 5051ca887c82506a9dcf8b71e0e6890f9e0e1589 (diff) | |
download | cpython-b4f39e85f2199bb9344e9b49feed3f6a45a318de.zip cpython-b4f39e85f2199bb9344e9b49feed3f6a45a318de.tar.gz cpython-b4f39e85f2199bb9344e9b49feed3f6a45a318de.tar.bz2 |
Fix issue 10527: make multiprocessing use poll() instead of select() if available.
-rw-r--r-- | Lib/multiprocessing/connection.py | 21 | ||||
-rw-r--r-- | Lib/test/test_multiprocessing.py | 6 | ||||
-rw-r--r-- | Misc/NEWS | 2 |
3 files changed, 27 insertions, 2 deletions
diff --git a/Lib/multiprocessing/connection.py b/Lib/multiprocessing/connection.py index 8b2be19..dc31f2f 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 9ec0be2..d973b44 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() @@ -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. |