ae9c701f90
This adds a executor backed job dispatching base class and has the existing blocking executor use it by running jobs and dispatching jobs into a sync executor. It also allows for dispatching jobs into a thread executor, or other executor via a new '_executor_factory' method that can generate executors (it can be overriden in the non-blocking executor to provide your own executors instances). This does alter the behavior in that now that jobs are dispatched into an executor we no longer can immediatly know if a job was dispatched and raised an exception or whether it will raise an exception in the future, so we now alter the 'local_dispatched' to just be a boolean that is used to determine if any dispatches happened (failure or not). Change-Id: I485770e8f4c85d3833892a453c9fb5168d8f0407
96 lines
2.7 KiB
ReStructuredText
96 lines
2.7 KiB
ReStructuredText
----------
|
|
Conductors
|
|
----------
|
|
|
|
.. image:: img/conductor.png
|
|
:width: 97px
|
|
:alt: Conductor
|
|
|
|
Overview
|
|
========
|
|
|
|
Conductors provide a mechanism that unifies the various
|
|
concepts under a single easy to use (as plug-and-play as we can make it)
|
|
construct.
|
|
|
|
They are responsible for the following:
|
|
|
|
* Interacting with :doc:`jobboards <jobs>` (examining and claiming
|
|
:doc:`jobs <jobs>`).
|
|
* Creating :doc:`engines <engines>` from the claimed jobs (using
|
|
:ref:`factories <resumption factories>` to reconstruct the contained
|
|
tasks and flows to be executed).
|
|
* Dispatching the engine using the provided :doc:`persistence <persistence>`
|
|
layer and engine configuration.
|
|
* Completing or abandoning the claimed :doc:`job <jobs>` (depending on
|
|
dispatching and execution outcome).
|
|
* *Rinse and repeat*.
|
|
|
|
.. note::
|
|
|
|
They are inspired by and have similar responsibilities
|
|
as `railroad conductors`_ or `musical conductors`_.
|
|
|
|
Considerations
|
|
==============
|
|
|
|
Some usage considerations should be used when using a conductor to make sure
|
|
it's used in a safe and reliable manner. Eventually we hope to make these
|
|
non-issues but for now they are worth mentioning.
|
|
|
|
Endless cycling
|
|
---------------
|
|
|
|
**What:** Jobs that fail (due to some type of internal error) on one conductor
|
|
will be abandoned by that conductor and then another conductor may experience
|
|
those same errors and abandon it (and repeat). This will create a job
|
|
abandonment cycle that will continue for as long as the job exists in an
|
|
claimable state.
|
|
|
|
**Example:**
|
|
|
|
.. image:: img/conductor_cycle.png
|
|
:scale: 70%
|
|
:alt: Conductor cycling
|
|
|
|
**Alleviate by:**
|
|
|
|
#. Forcefully delete jobs that have been failing continuously after a given
|
|
number of conductor attempts. This can be either done manually or
|
|
automatically via scripts (or other associated monitoring) or via
|
|
the jobboards :py:func:`~taskflow.jobs.base.JobBoard.trash` method.
|
|
#. Resolve the internal error's cause (storage backend failure, other...).
|
|
|
|
Interfaces
|
|
==========
|
|
|
|
.. automodule:: taskflow.conductors.base
|
|
.. automodule:: taskflow.conductors.backends
|
|
.. automodule:: taskflow.conductors.backends.impl_executor
|
|
|
|
Implementations
|
|
===============
|
|
|
|
Blocking
|
|
--------
|
|
|
|
.. automodule:: taskflow.conductors.backends.impl_blocking
|
|
|
|
Non-blocking
|
|
------------
|
|
|
|
.. automodule:: taskflow.conductors.backends.impl_nonblocking
|
|
|
|
Hierarchy
|
|
=========
|
|
|
|
.. inheritance-diagram::
|
|
taskflow.conductors.base
|
|
taskflow.conductors.backends.impl_blocking
|
|
taskflow.conductors.backends.impl_nonblocking
|
|
taskflow.conductors.backends.impl_executor
|
|
:parts: 1
|
|
|
|
.. _musical conductors: http://en.wikipedia.org/wiki/Conducting
|
|
.. _railroad conductors: http://en.wikipedia.org/wiki/Conductor_%28transportation%29
|