code: def select(self, timeout=None):
          
          if timeout is None:
              epoll_timeout = -1
          elif timeout <= 0:
              epoll_timeout = 0
          else:
              epoll_timeout = timeout
          max_events = len(self._fd_map) or -1
          result = []
          for fd, epoll_events in self._epoll.poll(epoll_timeout, max_events):
              key = self._fd_map.get(fd)
              events = _EpollSelectorEvents.from_epoll_events(epoll_events)
              events &= key.events
              if key:
                  result.append((key, _EpollSelectorEvents(events)))
          return result
docs: Wait until one or more of the registered file objects becomes ready
          or until the timeout expires.
  
          :param timeout:
              maximum wait time, in seconds (see below for special meaning)
  
          :returns:
              A list of pairs (key, events) for each ready file object.
              Note that the list may be empty if non-blocking behavior is
              selected or if the blocking wait is interrupted by a signal.
  
          The timeout argument has two additional special cases:
  
              1) If timeout is None then the call will block indefinitely
              2) If timeout <= 0 the call will never block