diff options
author | Giampaolo Rodola' <g.rodola@gmail.com> | 2012-12-31 16:23:09 (GMT) |
---|---|---|
committer | Giampaolo Rodola' <g.rodola@gmail.com> | 2012-12-31 16:23:09 (GMT) |
commit | cef2006eaff86f843b8f0fc21fc7b652415b96ed (patch) | |
tree | bea8b0ca40c3a78659e91f5f2191ac2d2bfa66e0 /Lib/multiprocessing | |
parent | 421489f8a6d9485b484fb5d51bcb5df094190b7e (diff) | |
download | cpython-cef2006eaff86f843b8f0fc21fc7b652415b96ed.zip cpython-cef2006eaff86f843b8f0fc21fc7b652415b96ed.tar.gz cpython-cef2006eaff86f843b8f0fc21fc7b652415b96ed.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 4421ac5..6c398fd 100644 --- a/Lib/multiprocessing/connection.py +++ b/Lib/multiprocessing/connection.py @@ -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 |