Skip to main content

Produce a plan that dispatches calls based on a graph of functions, satisfying data dependencies.

Project description

.. _start-intro:


What is schedula?
*****************

Schedula implements a intelligent function scheduler, which selects
and executes functions. The order (workflow) is calculated from the
provided inputs and the requested outputs. A function is executed when
all its dependencies (i.e., inputs, input domain) are satisfied and
when at least one of its outputs has to be calculated.

Note: Schedula is performing the runtime selection of the
**minimum-workflow** to be invoked. A workflow describes the
overall process - i.e., the order of function execution - and it is
defined by a directed acyclic graph (DAG). The **minimum-workflow**
is the DAG where each output is calculated using the shortest path
from the provided inputs. The path is calculated on the basis of a
weighed directed graph (data-flow diagram) with a modified Dijkstra
algorithm.


Installation
************

To install it use (with root privileges):

::

$ pip install schedula

Or download the last git version and use (with root privileges):

::

$ python setup.py install


Install extras
==============

Some additional functionality is enabled installing the following
extras:

* plot: enables the plot of the Dispatcher model and workflow (see
``plot()``).

* web: enables to build a dispatcher Flask app (see ``web()``).

* sphinx: enables the sphinx extension directives (i.e., autosummary
and dispatcher).

* parallel: enables the parallel execution of Dispatcher model.

To install schedula and all extras, do:

::

$ pip install schedula[all]

Note: ``plot`` extra requires to install Graphviz (`download page
<https://www.graphviz.org/download/>`_). Make sure that the
directory containing the ``dot`` executable is on your systems’
path.

.. _end-quick:


Why may I use schedula?
***********************

Imagine we have a system of interdependent functions - i.e. the inputs
of a function are the output for one or more function(s), and we do
not know which input the user will provide and which output will
request. With a normal scheduler you would have to code all possible
implementations. I’m bored to think and code all possible combinations
of inputs and outputs from a model.


Solution
========

Schedula allows to write a simple model (``Dispatcher``) with just the
basic functions, then the ``Dispatcher`` will select and execute the
proper functions for the given inputs and the requested outputs.
Moreover, schedula provides a flexible framework for structuring code.
It allows to extract sub-models from a bigger one and to run your
model asynchronously or in parallel without extra coding.

Note: A successful `application <https://github.com/JRCSTU/CO2MPAS-TA>`_
is CO_2MPAS, where schedula has been used to model an entire
`vehicle <https://co2mpas.io/explanation.html#execution-model>`_.


Very simple example
*******************

Let’s assume that we have to extract some filesystem attributes and we
do not know which inputs the user will provide. The code below shows
how to create a ``Dispatcher`` adding the functions that define your
system. Note that with this simple system the maximum number of inputs
combinations is 31 ((2^n - 1), where *n* is the number of data).

..

>>> import schedula as sh
>>> import os.path as osp
>>> dsp = sh.Dispatcher()
>>> dsp.add_data(data_id='dirname', default_value='.', initial_dist=2)
'dirname'
>>> dsp.add_function(function=osp.split, inputs=['path'],
... outputs=['dirname', 'basename'])
'split'
>>> dsp.add_function(function=osp.splitext, inputs=['basename'],
... outputs=['fname', 'suffix'])
'splitext'
>>> dsp.add_function(function=osp.join, inputs=['dirname', 'basename'],
... outputs=['path'])
'join'
>>> dsp.add_function(function_id='union', function=lambda *a: ''.join(a),
... inputs=['fname', 'suffix'], outputs=['basename'])
'union'

[graph]

Tip: You can explore the diagram by clicking on it.

Note: For more details how to created a ``Dispatcher`` see:
``add_data()``, ``add_func()``, ``add_function()``,
``add_dispatcher()``, ``SubDispatch``, ``SubDispatchFunction``,
``SubDispatchPipe``, ``DispatchPipe``, and ``DFun``.

The next step to calculate the outputs would be just to run the
``dispatch()`` method. You can invoke it with just the inputs, so it
will calculate all reachable outputs:

..

>>> inputs = {'path': 'schedula/_version.py'}
>>> o = dsp.dispatch(inputs=inputs)
>>> o
Solution([('path', 'schedula/_version.py'),
('basename', '_version.py'),
('dirname', 'schedula'),
('fname', '_version'),
('suffix', '.py')])

[graph]

or you can set also the outputs, so the dispatch will stop when it
will find all outputs:

..

>>> o = dsp.dispatch(inputs=inputs, outputs=['basename'])
>>> o
Solution([('path', 'schedula/_version.py'), ('basename', '_version.py')])

[graph]


Project details


Release history Release notifications | RSS feed

This version

0.3.0

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

schedula-0.3.0.tar.gz (125.5 kB view details)

Uploaded Source

Built Distribution

schedula-0.3.0-py3-none-any.whl (88.1 kB view details)

Uploaded Python 3

File details

Details for the file schedula-0.3.0.tar.gz.

File metadata

  • Download URL: schedula-0.3.0.tar.gz
  • Upload date:
  • Size: 125.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.20.0 setuptools/40.5.0 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.6.6

File hashes

Hashes for schedula-0.3.0.tar.gz
Algorithm Hash digest
SHA256 e1d2d147afc8711191e4e324d6a5812ac107b569f60e07fed1f8eb8fb0ab230a
MD5 8789775d6167064556b722afd8f02282
BLAKE2b-256 dc4c83c018cb828cd4b04805c56cddf57285a3992906b9b8a7fa14b0b052fd93

See more details on using hashes here.

File details

Details for the file schedula-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: schedula-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 88.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.20.0 setuptools/40.5.0 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.6.6

File hashes

Hashes for schedula-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 c86a2f9cdc42e9deca374ee4404dd81308df4c8d2684d2d2021a1dd8986d6c5a
MD5 9f4b038ec541b89575159fc38cb07308
BLAKE2b-256 a4596c85d825a94e98a269bf5e143e0f5e15f5ad835ef77236937fdb8211ae79

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page