Skip to main content


Easy Asynchronous Jobs Manager for Developers
Explore the docs »
Website · Examples in Python · Tutorial in Python

Zenaton library for Python

Zenaton helps developers to easily run, monitor and orchestrate background jobs on your workers without managing a queuing system. In addition to this, a monitoring dashboard shows you in real-time tasks executions and helps you to handle errors.

The Zenaton library for Python lets you code and launch tasks using Zenaton platform, as well as write workflows as code. You can sign up for an account on Zenaton and go through the tutorial in python.

Requirements

This package has been tested with Python 3.5.

Python Documentation

You can find all details on Zenaton's website.

Table of contents

Getting started

Installation

Install the Zenaton Agent

To install the Zenaton agent, run the following command:

curl https://install.zenaton.com/ | sh

Then, you need your agent to listen to your application. To do this, you need your Application ID and API Token. You can find both on your Zenaton account.

zenaton listen --app_id=YourApplicationId --api_token=YourApiToken --app_env=YourApplicationEnv --boot=boot.py

Install the library

To add the latest version of the library to your project, run the following command:

pip install zenaton

Framework integration

If you are using Django, please refer to our dedicated documentation to get started:

Quick start

Client Initialization

To start, you need to initialize the client. To do this, you need your Application ID and API Token. You can find both on your Zenaton account.

Then, initialize your Zenaton client:

from zenaton.client import Client

Client(your_app_id, your_api_token, your_app_env)

Executing a background job

A background job in Zenaton is a class implementing the Zenaton.abstracts.task.Task interface.

Let's start by implementing a first task printing something, and returning a value:

import random

from zenaton.abstracts.task import Task
from zenaton.traits.zenatonable import Zenatonable

class HelloWorldTask(Task, Zenatonable):

    def handle(self):
        print('Hello World\n')
        return random.randint (0, 1)

Now, when you want to run this task as a background job, you need to do the following:

HelloWorldTask().dispatch()

That's all you need to get started. With this, you can run many background jobs. However, the real power of Zenaton is to be able to orchestrate these jobs. The next section will introduce you to job orchestration.

Orchestrating background jobs

Job orchestration is what allows you to write complex business workflows in a simple way. You can execute jobs sequentially, in parallel, conditionally based on the result of a previous job, and you can even use loops to repeat some tasks.

We wrote about some use-cases of job orchestration, you can take a look at these articles to see how people use job orchestration.

Using workflows

A workflow in Zenaton is a class implementing the Zenaton.abstracts.workflow.Workflow interface.

We will implement a very simple workflow:

First, it will execute the HelloWorld task. The result of the first task will be used to make a condition using an if statement. When the returned value will be greater than 0, we will execute a second task named FinalTask. Otherwise, we won't do anything else.

One important thing to remember is that your workflow implementation must be idempotent. You can read more about that in our documentation.

The implementation looks like this:

from tasks.hello_world_task import HelloWorldTask
from tasks.final_task import FinalTask

from zenaton.abstracts.workflow import Workflow
from zenaton.traits.zenatonable import Zenatonable

class MyFirstWorkflow(Workflow, Zenatonable):

    def handle(self):

        n = HelloWorldTask().execute()

        if n > 0:
            FinalTask().execute()

Now that your workflow is implemented, you can execute it by calling the dispatch method:

MyFirstWorkflow().dispatch()

If you really want to run this example, you will need to implement the FinalTask task.

There are many more features usable in workflows in order to get the orchestration done right. You can learn more in our documentation.

Getting help

Need help? Feel free to contact us by chat on Zenaton.

Found a bug? You can open a GitHub issue.

Theorical Examples

Python examples repo

Real-life Examples

Triggering An Email After 3 Days of Cold Weather (Medium Article, Source Code)

Contributing

Bug reports and pull requests are welcome on GitHub here. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the Contributor Covenant code of conduct.

Testing

To test your changes before sending a pull request, first install the tests requirements:

pip install '.[test]'

Then run PyTest:

pytest

License

The package is available as open source under the terms of the MIT License.

Code of Conduct

Everyone interacting in the zenaton-Python project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the code of conduct.

Changelog

[0.4.2] - 2019-10-03

Added

  • Added custom_id argument for workflow schedule.
  • Dispatch of tasks and workflows are now done using the API instead of a local agent.
  • Pause, Resume and Kill workflows are now done using the API instead of a local agent.
  • Send event to workflow is now done using the API instead of a local agent.
  • Find workflow is now done using the API instead of a local agent.

[0.4.1] - 2019-09-25

Added

  • Added a intent_id property when dispatching workflows and tasks, sending events to workflows, and pausing/resuming/killing workflows.
  • Execution context for tasks and workflows
  • Optional on_error_retry_delay method handling task failures and specifying how many seconds to wait before retrying.

[0.4.0] - 2019-08-26

Added

  • Added a intent_id property when dispatching workflows and tasks, sending events to workflows, and pausing/resuming/killing workflows.

  • Added scheduling: schedule(cron)

[0.3.4] - 2019-07-01

Added

  • Run tests in a continuous integration flow.
  • No need for credentials when this lib is running in a Zenaton agent except if dispatching a sub-job.

[0.3.3] - 2019-06-25

Fixed

  • Fix a typo in client.py that prevents correct executions of versions

[0.3.2] - 2019-06-21

Fixed

  • Calling day_of_month on a wait task now waits for to wait for the next day having the requested day number, even if that means waiting for next month. (i.e calling Wait().day_of_month(31) on February, 2nd will wait for March, 31st)
  • Fixed Wait task behavior in some edge cases
  • Encodes HTTP params before sending request

Added

  • Added event_data property when sending event.

[0.3.1] - 2019-04-26

Fixed

  • Fixed MANIFEST.in file not included files required by setup.py.

[0.3.0] - 2019-03-25

Added

  • Calling dispatch on tasks now allows to process tasks asynchronously

Fixed

Fixed Wait task behavior in some edge cases Encodes HTTP params before sending request

[0.2.5] - 2018/10/17

Object Serialization (including circular structures)

[0.2.4] - 2018/09/26

Enhanced WithDuration & WithTimestamp classes

[0.2.3] - 2018/09/21

Minor enhancements (including the workflow find() method)

[0.2.2] - 2018/09/19

New version scheme management

[0.2.1] - 2018/09/17

Reorganized modules

[0.2.0] - 2018/09/14

Full rewriting of the package

Metadata

Release files for zenaton 0.4.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for zenaton 0.4.2
File Size Uploaded Provenance Actions
zenaton-0.4.2.tar.gz 29.0 kB Without provenance Details for zenaton-0.4.2.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for zenaton 0.4.2
File Interpreter ABI Platform Actions
zenaton-0.4.2-py3-none-any.whl Python 3 none any Details for zenaton-0.4.2-py3-none-any.whl

Total release size: 66.5 kB

Release files / zenaton-0.4.2.tar.gz

Download URL zenaton-0.4.2.tar.gz
Size 29.0 kB
Tags Source
SHA-256 checksum
How to use checksums
a4a470053c4275d8c5ad8b71c939bc7faf9c8065f435aaf68e7f1376ffe22cd5
BLAKE2b-256 checksum
How to use checksums
2862f160c973d4b71cb2452ffd9c0a5b92f13751d639cefb671e0e8851fa59ef
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/2.0.0 pkginfo/1.5.0.1 requests/2.20.1 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.35.0 CPython/3.7.3

Release files / zenaton-0.4.2-py3-none-any.whl

Download URL zenaton-0.4.2-py3-none-any.whl
Size 37.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
459231eacf9ac8d29dee9f05f1fda68f290b39b02220b6d329786c2829d1a21a
BLAKE2b-256 checksum
How to use checksums
7fe01d3a8dfac0ef057d085280be7cd7bc796b58ce30f984da755d0c1cef93e6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/2.0.0 pkginfo/1.5.0.1 requests/2.20.1 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.35.0 CPython/3.7.3

Security for zenaton 0.4.2

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page