'Initialise the task and run its first step.
If a timeout is specified, any attempt to step the task after that
number of seconds has elapsed will result in a Timeout being
raised inside the task.'

def start(self, timeout=None):

    assert (self._runner is None), 'Task    already    started'
    assert (not self._done), 'Task    already    cancelled'
    LOG.debug('%s    starting', six.text_type(self))
    if (timeout is not None):
        self._timeout = Timeout(self, timeout)
    result = self._task(*self._args, **self._kwargs)
    if isinstance(result, types.GeneratorType):
        self._runner = result
        self.step()
    else:
        self._runner = False
        self._done = True
        LOG.debug('%s    done    (not    resumable)', six.text_type(self))
