summaryrefslogtreecommitdiffstats
path: root/Lib/multiprocessing
diff options
context:
space:
mode:
authorGiampaolo Rodola' <g.rodola@gmail.com>2012-12-31 16:38:46 (GMT)
committerGiampaolo Rodola' <g.rodola@gmail.com>2012-12-31 16:38:46 (GMT)
commitb4f39e85f2199bb9344e9b49feed3f6a45a318de (patch)
treed9afc3d38ed409698be1cb3e5a4aab1c5d568372 /Lib/multiprocessing
parent8d518970ce30387db8168ea45402a871167562df (diff)
parent5051ca887c82506a9dcf8b71e0e6890f9e0e1589 (diff)
downloadcpython-b4f39e85f2199bb9344e9b49feed3f6a45a318de.zip
cpython-b4f39e85f2199bb9344e9b49feed3f6a45a318de.tar.gz
cpython-b4f39e85f2199bb9344e9b49feed3f6a45a318de.tar.bz2
Fix issue 10527: make multiprocessing use poll() instead of select() if available.
Diffstat (limited to 'Lib/multiprocessing')
-rw-r--r--Lib/multiprocessing/connection.py21
1 files changed, 21 insertions, 0 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):
'''