Produce a plan that dispatches calls based on a graph of functions, satisfying data dependencies.
Project description
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 Graphviz. Make sure that the directory
containing the dot executable is on your systems’ path. If you have not you can install it from its download page.
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
is CO_2MPAS, where schedula has been used to model an entire vehicle.
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
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file schedula-0.3.7.tar.gz
.
File metadata
- Download URL: schedula-0.3.7.tar.gz
- Upload date:
- Size: 98.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/2.0.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.4.0 requests-toolbelt/0.9.1 tqdm/4.36.1 CPython/3.7.4
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 80620e837204d31a7f49068e2b22c10016a956bf954d10be1e7c57b88240a9fa |
|
MD5 | 83ca0ff577b138b1a221bfd67a983db9 |
|
BLAKE2b-256 | bca65d85af8ebad279c2e10d23fa6a02b97acc0f7bf479d21c909de0d684d712 |
File details
Details for the file schedula-0.3.7-py2.py3-none-any.whl
.
File metadata
- Download URL: schedula-0.3.7-py2.py3-none-any.whl
- Upload date:
- Size: 96.7 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/2.0.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.4.0 requests-toolbelt/0.9.1 tqdm/4.36.1 CPython/3.7.4
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 9eab3e92dea11ccc5ffeb80a90c3e9f3625addec4f93c804538ad4bc53eb33c7 |
|
MD5 | b8f9915f4bd9b3c94f34ec4b6411c459 |
|
BLAKE2b-256 | 94a455c0393340b0c2d001e933594e750f9362ae86ca4b245dc89685ce6810cb |