_terminate_tasks(self)

Send signals to terminate all tasks. This is called once from
_keep_scheduling() or _is_work_scheduled() in the event dispatching
thread. It will not be called while the _schedule_tasks() implementation
is running, in order to avoid potential interference. All tasks should be
cleaned up at the earliest opportunity, but not necessarily before this
method returns. Typically, this method will send kill signals and return
without waiting for exit status. This allows basic cleanup to occur, such
as flushing of buffered output to logs.

_running_job_count(self)

_schedule_tasks(self)

This is called from inside the _schedule() method, which
guarantees the following:
1) It will not be called recursively.
2) _terminate_tasks() will not be called while it is running.
3) The state of the boolean _terminated_tasks variable will
not change while it is running.
Unless this method is used to perform user interface updates,
or something like that, the first thing it should do is check
the state of _terminated_tasks and if that is True then it
should return immediately (since there's no need to
schedule anything after _terminate_tasks() has been called).