Improve documentation for engines

Partially implements blueprint sphinx-docs.

Change-Id: I75428a42ff2a53ea50304be6a497c6a17a45db16
This commit is contained in:
Ivan A. Melnikov
2014-03-31 17:19:37 +04:00
parent c95bf4165d
commit 470b2b8946

View File

@@ -2,6 +2,100 @@
Engines
-------
.. automodule:: taskflow.engines.base
Overview
========
Engines are what **really** runs your tasks and flows.
An *engine* takes a flow structure (described by :doc:`patterns`) and uses it to
decide which :doc:`atom <atoms>` to run and when.
TaskFlow provides different implementation of engines. Some may be easier to
use (ie, require no additional infrastructure setup) and understand, others
might require more complicated setup but provide better scalability. The idea
and *ideal* is that deployers or developers of a service that uses TaskFlow can
select an engine that suites their setup best without modifying the code of
said service.
Engines might have different capabilities and configuration, but all of them
**must** implement same interface and preserve semantics of patterns (e.g.
parts of :py:class:`linear flow <taskflow.patterns.linear_flow.Flow>` are run
one after another, in order, even if engine is *capable* run tasks in
parallel).
Creating Engines
================
All engines are mere classes that implement same interface, and of course it is
possible to import them and create their instances just like with any classes
in Python. But easier (and recommended) way for creating engine is using
engine helpers. All of them are imported into `taskflow.engines` module, so the
typical usage of them might look like::
from taskflow import engines
...
flow = make_flow()
engine = engines.load(flow, engine_conf=my_conf, backend=my_persistence_conf)
engine.run
.. automodule:: taskflow.engines.helpers
Engine Configuration
====================
To select which engine to use and pass parameters to an engine you should use
``engine_conf`` parameter any helper factory function accepts. It may be:
* a string, naming engine type;
* a dictionary, holding engine type with key ``'engine'`` and possibly
type-specific engine parameters.
Known engine types are listed below.
Single-Threaded Engine
----------------------
**Engine type**: ``'serial'``
Runs all tasks on the single thread -- the same thread `engine.run()` is called
on. This engine is used by default.
Parallel Engine
---------------
**Engine type**: ``'parallel'``
Parallel engine schedules tasks onto different threads to run them in parallel.
Additional configuration parameters:
* ``executor``: a class that provides ``concurrent.futures.Executor``-like
interface; it will be used for scheduling tasks. You can use instances
of ``concurrent.futures.ThreadPoolExecutor`` or
``taskflow.utils.eventlet_utils.GreenExecutor``. Sharing executor between
engine instances provides better scalability.
.. note::
Running tasks with ``concurrent.futures.ProcessPoolExecutor`` is not
supported now.
Worker-Based Engine
-------------------
**Engine type**: ``'worker-based'``
This is engine that schedules tasks to **workers** -- separate processes
dedicated for tasks execution, possibly running on other machines.
This engine is under active development and is not recommended for production
use yet. For more information, please see `wiki page`_ for more details.
.. _wiki page: https://wiki.openstack.org/wiki/TaskFlow/Worker-based_Engine
Engine Interface
================
.. automodule:: taskflow.engines.base