diff options
author | Giampaolo Rodola' <g.rodola@gmail.com> | 2012-12-31 16:38:17 (GMT) |
---|---|---|
committer | Giampaolo Rodola' <g.rodola@gmail.com> | 2012-12-31 16:38:17 (GMT) |
commit | 5051ca887c82506a9dcf8b71e0e6890f9e0e1589 (patch) | |
tree | 58ae10a84a90f811946e5483ac5fb14e8c4593f5 /Lib | |
parent | 0210194d48569ce136bad4d324ade03767356905 (diff) | |
parent | 5e844c8052d13202261c2eb95f07802615c66921 (diff) | |
download | cpython-5051ca887c82506a9dcf8b71e0e6890f9e0e1589.zip cpython-5051ca887c82506a9dcf8b71e0e6890f9e0e1589.tar.gz cpython-5051ca887c82506a9dcf8b71e0e6890f9e0e1589.tar.bz2 |
Fix issue 10527: make multiprocessing use poll() instead of select() if available.
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/multiprocessing/connection.py | 21 | ||||
-rw-r--r-- | Lib/test/test_multiprocessing.py | 6 |
2 files changed, 25 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() |