def METHOD_NAME(self):
    if not self.read_socket:
        raise RuntimeError("Attempt to read from write only stream")
    # No read mutex is needed because reads happen serially
    try:
        while True:  # Loop until we get some data
            data = self.read_socket.recv(4096)
            if data:
                break
            # raise EOFError, 'end of file reached' if not data
            # if data == :wait_readable:
            #   # Wait for the socket to be ready for reading or for the timeout
            #   try:
            #     result = IO.fast_select([self.read_socket, self.pipe_reader], None, None, self.read_timeout)
            #     # If select returns something it means the socket is now available for
            #     # reading so retry the read. If it returns None it means we timed out.
            #     # If the pipe is present that means we closed the socket
            #     if result:
            #       if result.include?(self.pipe_reader):
            #         raise IOError
            #       else:
            #         next
            #     else:
            #       raise Timeout=Error, "Read Timeout"
            #   except: IOError, Errno='ENOTSOCK'
            #     # These can happen with the socket being closed while waiting on select
            #     data = ''
            # break
    except OSError:  # Handle [Errno 9] Bad file descriptor
        data = ""
    return data