':param dag_directory: Directory where DAG definitions are kept. All
files in file_paths should be under this directory
:type dag_directory: unicode
:param file_paths: list of file paths that contain DAG definitions
:type file_paths: list[unicode]
:param parallelism: maximum number of simultaneous process to run at once
:type parallelism: int
:param process_file_interval: process a file at most once every this
many seconds
:type process_file_interval: float
:param max_runs: The number of times to parse and schedule each file. -1
for unlimited.
:type max_runs: int
:param child_process_log_directory: Store logs for child processes in
this directory
:type child_process_log_directory: unicode
:type process_file_interval: float
:param processor_factory: function that creates processors for DAG
definition files. Arguments are (dag_definition_path, log_file_path)
:type processor_factory: (unicode, unicode) -> (AbstractDagFileProcessor)'

def __init__(self, dag_directory, file_paths, parallelism, process_file_interval, child_process_log_directory, max_runs, processor_factory):

    self._file_paths = file_paths
    self._file_path_queue = []
    self._parallelism = parallelism
    self._dag_directory = dag_directory
    self._max_runs = max_runs
    self._process_file_interval = process_file_interval
    self._child_process_log_directory = child_process_log_directory
    self._processor_factory = processor_factory
    self._processors = {}
    self._last_runtime = {}
    self._last_finish_time = {}
    self._run_count = defaultdict(int)
    self._heart_beat_key = u'heart-beat'
