diff -r e4d45315c38c Lib/multiprocessing/connection.py --- a/Lib/multiprocessing/connection.py Wed Sep 04 19:02:49 2013 +0200 +++ b/Lib/multiprocessing/connection.py Thu Sep 05 18:40:07 2013 +0200 @@ -12,7 +12,7 @@ import io import os import sys -import select +import selectors import socket import struct import errno @@ -877,48 +877,28 @@ 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 wait(object_list, timeout=None): ''' Wait till an object in object_list is ready/readable. Returns list of those objects in object_list which are ready/readable. ''' - if timeout is not None: - if timeout <= 0: - return _poll(object_list, 0) - else: + with selectors.DefaultSelector() as selector: + for obj in object_list: + selector.register(obj, selectors.EVENT_READ) + + if timeout is not None: deadline = time.time() + timeout - while True: - try: - return _poll(object_list, timeout) - except OSError as e: - if e.errno != errno.EINTR: - raise - if timeout is not None: - timeout = deadline - time.time() + + while True: + ready = selector.select(timeout) + if ready: + return [key.fileobj for (key, events) in ready] + else: + if timeout is not None: + timeout = deadline - time.time() + if timeout < 0: + return ready # # Make connection and socket objects sharable if possible diff -r e4d45315c38c Lib/multiprocessing/forkserver.py --- a/Lib/multiprocessing/forkserver.py Wed Sep 04 19:02:49 2013 +0200 +++ b/Lib/multiprocessing/forkserver.py Thu Sep 05 18:40:07 2013 +0200 @@ -1,6 +1,6 @@ import errno import os -import select +import selectors import signal import socket import struct @@ -149,14 +149,20 @@ # ignoring SIGCHLD means no need to reap zombie processes handler = signal.signal(signal.SIGCHLD, signal.SIG_IGN) - with socket.socket(socket.AF_UNIX, fileno=listener_fd) as listener: + with socket.socket(socket.AF_UNIX, fileno=listener_fd) as listener, \ + selectors.DefaultSelector() as selector: global _forkserver_address _forkserver_address = listener.getsockname() - readers = [listener, alive_r] + + selector.register(listener, selectors.EVENT_READ) + selector.register(alive_r, selectors.EVENT_READ) while True: try: - rfds, wfds, xfds = select.select(readers, [], []) + while True: + rfds = [key.fileobj for (key, events) in selector.select()] + if rfds: + break if alive_r in rfds: # EOF because no more client processes left