'Starts the scheduler. The details of this process depend on the implementation.
:raises SchedulerAlreadyRunningError: if the scheduler is already running'

@abstractmethod
def start(self):

    if self.running:
        raise SchedulerAlreadyRunningError
    with self._executors_lock:
        if ('default' not in self._executors):
            self.add_executor(self._create_default_executor(), 'default')
        for (alias, executor) in six.iteritems(self._executors):
            executor.start(self, alias)
    with self._jobstores_lock:
        if ('default' not in self._jobstores):
            self.add_jobstore(self._create_default_jobstore(), 'default')
        for (alias, store) in six.iteritems(self._jobstores):
            store.start(self, alias)
        for (job, jobstore_alias, replace_existing) in self._pending_jobs:
            self._real_add_job(job, jobstore_alias, replace_existing, False)
        del self._pending_jobs[:]
    self._stopped = False
    self._logger.info('Scheduler    started')
    self._dispatch_event(SchedulerEvent(EVENT_SCHEDULER_START))
