def METHOD_NAME(self, timeout=2,input=None):
    """ An extension to communicate() that allows for external cancels
    to abort processing.  
    All internal I/O calls are non-blocking.
    The timeout is in seconds and is the max. amount of time to wait in 
    select() for something to read from either stdout or stderr.  This 
    then effects how responsive it will be to cancel requests.
    """
    terminated=False
    output = []
    error = []
    self._setupNonblocking()
    if self.stdin:
        if input:
            self.stdin.write(input)
        # ESCALATION-151 - always close stdin, even when no input from caller
        self.stdin.close()
    while not (terminated or self.cancelRequested):
        terminated = self._check_status()
        if not terminated:
            self._read_files(timeout,output,error)
    # Consume rest of output
    self._finish_read_files(timeout,output,error)
    (resout,reserr)=self._postprocess_outputs(output,error)
    return (self.returncode,resout,reserr)