------------------
* Added a ``delayed_start`` flag to TaskGraph to allow for delayed execution
of taskgraph tasks. If enabled on threaded or multiprocess mode, calls to
``add_task`` will not execute tasks until the ``join`` method is invoked on
``taskgraph``. This allows for finer control over execution order when tasks
are passed non-equivalent ``priority`` levels.
* Fixing an issue where a non-JSON serializeable object would cause
``add_task`` to crash. Now TaskGraph is more tolerant of non-JSON
serializeable objects and will log warnings when parameters cannot be
serialized.
* TaskGraph constructor has an option to report a ongoing logging message
at a set interval. The message reports how many tasks have been committed
and completed.
* Fixed a bug that would cause TaskGraph to needlessly reexecute a task if
the only change was the order of the ``target_path_list`` or
``dependent_task_list`` variables.
* Fixed a bug that would cause a task to reexecute between runs if input
argument was a file that would be generated by a task that had not yet
executed.
* Made a code change that makes it very likely that tasks will be executed in
priority order if added to a TaskGraph in delayed execution mode.
* Refactored internal TaskGraph scheduling to fix a design error that made it
likely tasks would be needlessly reexecuted. This also simplified TaskGraph
flow control and cause slight performance improvements.
* Fixed an issue discovered when a ``scipy.sparse`` matrix was passed as an
argument and ``add_task`` crashed on infinite recursion. Type checking of
arguments has been simplified and now iteration only occurs on the Python
``set``, ``dict``, ``list``, and ``tuple`` types.
* Fixed an issue where the ``TaskGraph`` was not ``join``\ing the worker
process pool on a closed/join TaskGraph, or when the ``TaskGraph`` object
was being deconstructed. This would occasionally cause a race condition
where the TaskGraph may still have a cache ``.json`` file open. Discovered
through a flaky build test.
* Added functionality to the ``TaskGraph`` object to propagate log messages
from workers back to the parent process. This only applies for cases where
a ``TaskGraph`` instance is started with ``n_workers > 0``.
* Fixed an issue where a function that was passed as an argument would cause
a reexecution on a separate run because the ``__repr__`` of a function
includes its pointer address.
* Adjusted logging levels so that detailed task information is shown on DEBUG
but basic status updates are shown in INFO.