'Run another step of the task.
Return True if the task is complete; False otherwise.'

def step(self):

    if (not self.done()):
        assert (self._runner is not None), 'Task    not    started'
        if (self._poll_period > 1):
            self._poll_period -= 1
            return False
        if ((self._timeout is not None) and self._timeout.expired()):
            LOG.info('%s    timed    out', self)
            self._done = True
            self._timeout.trigger(self._runner)
        else:
            LOG.debug('%s    running', six.text_type(self))
            try:
                poll_period = next(self._runner)
            except StopIteration:
                self._done = True
                LOG.debug('%s    complete', six.text_type(self))
            else:
                if isinstance(poll_period, six.integer_types):
                    self._poll_period = max(poll_period, 1)
                else:
                    self._poll_period = 1
    return self._done
