]> granicus.if.org Git - python/commitdiff
Fix issue 10527: make multiprocessing use poll() instead of select() if available.
authorGiampaolo Rodola' <g.rodola@gmail.com>
Mon, 31 Dec 2012 16:23:09 +0000 (17:23 +0100)
committerGiampaolo Rodola' <g.rodola@gmail.com>
Mon, 31 Dec 2012 16:23:09 +0000 (17:23 +0100)
Lib/multiprocessing/connection.py
Lib/test/test_multiprocessing.py
Misc/NEWS

index 4421ac5cfd7a274279e489d3dd43603e0cfbb897..6c398fdc918671597341df0afe7d9ea8a1fa2e57 100644 (file)
@@ -200,6 +200,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]
 
     from _multiprocessing import win32
 
index 15870570db082918d3fd2ffe8ee357a3309e2048..f140aca63f179e5ede9b93369d85b576c25bff43 100644 (file)
@@ -1513,6 +1513,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)
index 8ec9675fb475515444403e3a960b85d68ce43c12..e99efca3ffdae4c2167017e1569b34f3450aa104 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -175,6 +175,8 @@ Core and Builtins
 Library
 -------
 
+- Issue 10527: make multiprocessing use poll() instead of select() if available.
+
 - Issue #16485: Fix file descriptor not being closed if file header patching
   fails on closing of aifc file.