class_docstr: Task Scheduling controller.
  Notice time-zone is ALWAYS UTC
class_docstr_tok: ["Task","Scheduling","controller",".","Notice","time-zone","is","ALWAYS","UTC"]
docstr: Create a Task scheduler service
  
  :param sync_frequency_minutes: Sync task scheduler configuration every X minutes.
      Allow to change scheduler in runtime by editing the Task configuration object
  :param force_create_task_name: Optional, force creation of Task Scheduler service,
      even if main Task.init already exists.
  :param force_create_task_project: Optional, force creation of Task Scheduler service,
      even if main Task.init already exists.
docstr_tok: ["Create","a","Task","scheduler","service",":","param","sync_frequency_minutes",":","Sync","task","scheduler","configuration","every","X","minutes",".","Allow","to","change","scheduler","in","runtime","by","editing","the","Task","configuration","object",":","param","force_create_task_name",":","Optional",",","force","creation","of","Task","Scheduler","service",",","even","if","main","Task.init","already","exists",".",":","param","force_create_task_project",":","Optional",",","force","creation","of","Task","Scheduler","service",",","even","if","main","Task.init","already","exists","."]
code: def __init__(
      self,
      sync_frequency_minutes=15,
      force_create_task_name=None,
      force_create_task_project=None,
  ):
      # type: (float, Optional[str], Optional[str]) -> None
      """
      Create a Task scheduler service
  
      :param sync_frequency_minutes: Sync task scheduler configuration every X minutes.
          Allow to change scheduler in runtime by editing the Task configuration object
      :param force_create_task_name: Optional, force creation of Task Scheduler service,
          even if main Task.init already exists.
      :param force_create_task_project: Optional, force creation of Task Scheduler service,
          even if main Task.init already exists.
      """
      super(TaskScheduler, self).__init__(
          sync_frequency_minutes=sync_frequency_minutes,
          force_create_task_name=force_create_task_name,
          force_create_task_project=force_create_task_project,
      )
      self._schedule_jobs = []  # List[ScheduleJob]
      self._timeout_jobs = {}  # Dict[datetime, str]
      self._executed_jobs = []
  
imports: import json
  import logging
  from datetime import datetime
  from threading import Thread, enumerate
  from time import sleep, time
  from typing import List, Union, Optional, Callable, Sequence, Dict
  from attr import attrs, attrib
  from dateutil.relativedelta import relativedelta
  from .job import ClearmlJob
  from .controller import PipelineController
  from ..backend_interface.util import datetime_from_isoformat, datetime_to_isoformat, mutually_exclusive
  from ..task import Task
label_desc: Use image node_id 1 to create a new TaskScheduler object from inherited base classes: BaseScheduler with example: obj = TaskScheduler(sync_frequency_minutes, force_create_task_name, force_create_task_project)