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 /Lib/multiprocessing | |
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.
Diffstat (limited to 'Lib/multiprocessing')
-rw-r--r-- | Lib/multiprocessing/connection.py | 21 |
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): ''' |