donald


Namedonald JSON
Version 2.0.1 PyPI version JSON
download
home_pageNone
SummaryTask manager for asyncio
upload_time2025-07-11 09:44:54
maintainerNone
docs_urlNone
authorNone
requires_python>=3.9
licenseMIT License
keywords asyncio tasks queue
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            Donald 2.0.1
#############

.. _description:

**Donald** — A fast and minimal task manager for **Asyncio**.


Donald supports both synchronous and asynchronous functions. It can run
coroutines across multiple event loops, schedule periodic tasks, and consume
jobs from AMQP queues.

.. _badges:

.. image:: https://github.com/klen/donald/workflows/tests/badge.svg
    :target: https://github.com/klen/donald/actions
    :alt: Tests Status

.. image:: https://img.shields.io/pypi/v/donald
    :target: https://pypi.org/project/donald/
    :alt: PYPI Version

.. image:: https://img.shields.io/pypi/pyversions/donald
    :target: https://pypi.org/project/donald/
    :alt: Python Versions

.. _contents:

.. contents::

.. _features:

Key Features
============

- Works with asyncio
- Simple and lightweight API
- Supports multiple backends: `memory`, `redis`, `amqp`
- Periodic task scheduling (cron or intervals)
- Built-in retry mechanism and failbacks
- Can run multiple workers and schedulers in separate processes

.. _requirements:

Requirements
=============

- Python 3.10 or newer

.. _installation:

Installation
=============

Install via pip:

::

    pip install donald

With Redis backend support:

::

    pip install donald[redis]


.. _usage:

Quick Start
===========

Initialize a task manager:

.. code:: python

    import logging
    from donald import Donald

    # Init Donald
    manager = Donald(

        # Params (default values)
        # -----------------------

        # Setup logging
        log_level=logging.INFO,
        log_config=None,

        # Choose a backend (memory|redis|amqp)
        # memory - is only recommended for testing/local development
        backend='memory',

        # Backend connection params
        # redis: {'url': 'redis://localhost:6379/0', 'channel': 'donald'}
        # amqp: {'url': 'amqp://guest:guest@localhost:5672/', 'queue': 'donald', 'exchange': 'donald'}
        backend_params={},

        # Tasks worker params
        worker_params={
          # Max tasks in work
          'max_tasks': 0,

          # Tasks default params (delay, timeout)
          'task_defaults': {},

          # A awaitable function to run on worker start
          'on_start': None

          # A awaitable function to run on worker stop
          'on_stop': None

          # A awaitable function to run on worker error
          'on_error': None

        },
    )

    # Wrap a function to task
    @manager.task()
    async def mytask(*args, **kwargs):
        # Do some job here

    # Start the manager somewhere (on app start for example)
    await manager.start()

    # you may run a worker in the same process
    # not recommended for production
    worker = manager.create_worker()
    worker.start()

    # ...

    # Submit the task to workers
    mytask.submit(*args, **kwargs)

    # ...

    # Stop the manager when you need
    await worker.stop()
    await manager.stop()

.. _task-tuning:

Task Tuning
===========

.. code:: python

  # Set delay and timeout
  @tasks.task(delay=5, timeout=60)
  async def delayed_task(*args, **kwargs):
      ...

  # Automatic retries on error
  @tasks.task(retries_max=3, retries_backoff_factor=2, retries_backoff_max=60)
  async def retrying_task(*args, **kwargs):
      ...

  # Define a failback function
  @retrying_task.failback()
  async def on_fail(*args, **kwargs):
      ...

  # Manual retry control
  @tasks.task(bind=True)
  async def conditional_retry(self):
      try:
          ...
      except Exception:
          if self.retries < 3:
              self.retry()
          else:
              raise

.. _scheduler:

Scheduling Tasks
================

.. code:: python

  @tasks.task()
  async def mytask(*args, **kwargs):
      ...

  # Run every 5 minutes
  mytask.schedule('*/5 * * * *')

  # Start the scheduler (not recommended in production)
  manager.scheduler.start()

  # Stop it when needed
  manager.scheduler.stop()

.. _production:

Running in Production
=====================

Create a task manager in `tasks.py`:

.. code:: python

  from donald import Donald

  manager = Donald(backend='amqp')

  # Define your tasks and schedules

Start a worker in a separate process:

.. code:: bash

   $ donald -M tasks.manager worker

Start the scheduler (optional):

.. code:: bash

   $ donald -M tasks.manager scheduler


.. _bugtracker:

Bug tracker
===========

Found a bug or have a feature request?
Please open an issue:
👉 https://github.com/klen/donald/issues

.. _contributing:

Contributing
============

Contributions are welcome!
Development happens on GitHub:
🔗 https://github.com/klen/donald

.. _license:

License
========

Licensed under a `MIT license`_.

.. _links:

.. _MIT license: http://opensource.org/licenses/MIT
.. _klen: https://klen.github.io/

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "donald",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.9",
    "maintainer_email": null,
    "keywords": "asyncio, tasks, queue",
    "author": null,
    "author_email": "Kirill Klenov <horneds@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/7b/15/7744022af3fc0c42091563ac04cb41256535edff607cb27203c20c7968e4/donald-2.0.1.tar.gz",
    "platform": null,
    "description": "Donald 2.0.1\n#############\n\n.. _description:\n\n**Donald** \u2014 A fast and minimal task manager for **Asyncio**.\n\n\nDonald supports both synchronous and asynchronous functions. It can run\ncoroutines across multiple event loops, schedule periodic tasks, and consume\njobs from AMQP queues.\n\n.. _badges:\n\n.. image:: https://github.com/klen/donald/workflows/tests/badge.svg\n    :target: https://github.com/klen/donald/actions\n    :alt: Tests Status\n\n.. image:: https://img.shields.io/pypi/v/donald\n    :target: https://pypi.org/project/donald/\n    :alt: PYPI Version\n\n.. image:: https://img.shields.io/pypi/pyversions/donald\n    :target: https://pypi.org/project/donald/\n    :alt: Python Versions\n\n.. _contents:\n\n.. contents::\n\n.. _features:\n\nKey Features\n============\n\n- Works with asyncio\n- Simple and lightweight API\n- Supports multiple backends: `memory`, `redis`, `amqp`\n- Periodic task scheduling (cron or intervals)\n- Built-in retry mechanism and failbacks\n- Can run multiple workers and schedulers in separate processes\n\n.. _requirements:\n\nRequirements\n=============\n\n- Python 3.10 or newer\n\n.. _installation:\n\nInstallation\n=============\n\nInstall via pip:\n\n::\n\n    pip install donald\n\nWith Redis backend support:\n\n::\n\n    pip install donald[redis]\n\n\n.. _usage:\n\nQuick Start\n===========\n\nInitialize a task manager:\n\n.. code:: python\n\n    import logging\n    from donald import Donald\n\n    # Init Donald\n    manager = Donald(\n\n        # Params (default values)\n        # -----------------------\n\n        # Setup logging\n        log_level=logging.INFO,\n        log_config=None,\n\n        # Choose a backend (memory|redis|amqp)\n        # memory - is only recommended for testing/local development\n        backend='memory',\n\n        # Backend connection params\n        # redis: {'url': 'redis://localhost:6379/0', 'channel': 'donald'}\n        # amqp: {'url': 'amqp://guest:guest@localhost:5672/', 'queue': 'donald', 'exchange': 'donald'}\n        backend_params={},\n\n        # Tasks worker params\n        worker_params={\n          # Max tasks in work\n          'max_tasks': 0,\n\n          # Tasks default params (delay, timeout)\n          'task_defaults': {},\n\n          # A awaitable function to run on worker start\n          'on_start': None\n\n          # A awaitable function to run on worker stop\n          'on_stop': None\n\n          # A awaitable function to run on worker error\n          'on_error': None\n\n        },\n    )\n\n    # Wrap a function to task\n    @manager.task()\n    async def mytask(*args, **kwargs):\n        # Do some job here\n\n    # Start the manager somewhere (on app start for example)\n    await manager.start()\n\n    # you may run a worker in the same process\n    # not recommended for production\n    worker = manager.create_worker()\n    worker.start()\n\n    # ...\n\n    # Submit the task to workers\n    mytask.submit(*args, **kwargs)\n\n    # ...\n\n    # Stop the manager when you need\n    await worker.stop()\n    await manager.stop()\n\n.. _task-tuning:\n\nTask Tuning\n===========\n\n.. code:: python\n\n  # Set delay and timeout\n  @tasks.task(delay=5, timeout=60)\n  async def delayed_task(*args, **kwargs):\n      ...\n\n  # Automatic retries on error\n  @tasks.task(retries_max=3, retries_backoff_factor=2, retries_backoff_max=60)\n  async def retrying_task(*args, **kwargs):\n      ...\n\n  # Define a failback function\n  @retrying_task.failback()\n  async def on_fail(*args, **kwargs):\n      ...\n\n  # Manual retry control\n  @tasks.task(bind=True)\n  async def conditional_retry(self):\n      try:\n          ...\n      except Exception:\n          if self.retries < 3:\n              self.retry()\n          else:\n              raise\n\n.. _scheduler:\n\nScheduling Tasks\n================\n\n.. code:: python\n\n  @tasks.task()\n  async def mytask(*args, **kwargs):\n      ...\n\n  # Run every 5 minutes\n  mytask.schedule('*/5 * * * *')\n\n  # Start the scheduler (not recommended in production)\n  manager.scheduler.start()\n\n  # Stop it when needed\n  manager.scheduler.stop()\n\n.. _production:\n\nRunning in Production\n=====================\n\nCreate a task manager in `tasks.py`:\n\n.. code:: python\n\n  from donald import Donald\n\n  manager = Donald(backend='amqp')\n\n  # Define your tasks and schedules\n\nStart a worker in a separate process:\n\n.. code:: bash\n\n   $ donald -M tasks.manager worker\n\nStart the scheduler (optional):\n\n.. code:: bash\n\n   $ donald -M tasks.manager scheduler\n\n\n.. _bugtracker:\n\nBug tracker\n===========\n\nFound a bug or have a feature request?\nPlease open an issue:\n\ud83d\udc49 https://github.com/klen/donald/issues\n\n.. _contributing:\n\nContributing\n============\n\nContributions are welcome!\nDevelopment happens on GitHub:\n\ud83d\udd17 https://github.com/klen/donald\n\n.. _license:\n\nLicense\n========\n\nLicensed under a `MIT license`_.\n\n.. _links:\n\n.. _MIT license: http://opensource.org/licenses/MIT\n.. _klen: https://klen.github.io/\n",
    "bugtrack_url": null,
    "license": "MIT License",
    "summary": "Task manager for asyncio",
    "version": "2.0.1",
    "project_urls": {
        "homepage": "https://github.com/klen/donald",
        "repository": "https://github.com/klen/donald"
    },
    "split_keywords": [
        "asyncio",
        " tasks",
        " queue"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "ddb4e0b21081a95d98595a10ebdf02fa9306901e023ba64d37d2689acb5c0f5c",
                "md5": "17bb3c9c0c6af6f12450ed5f6f529b56",
                "sha256": "3b49203a7ab0430a9c977a1f34e74c0c5ac880b32826e9f943fa1a2892738395"
            },
            "downloads": -1,
            "filename": "donald-2.0.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "17bb3c9c0c6af6f12450ed5f6f529b56",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.9",
            "size": 15994,
            "upload_time": "2025-07-11T09:44:53",
            "upload_time_iso_8601": "2025-07-11T09:44:53.119003Z",
            "url": "https://files.pythonhosted.org/packages/dd/b4/e0b21081a95d98595a10ebdf02fa9306901e023ba64d37d2689acb5c0f5c/donald-2.0.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "7b157744022af3fc0c42091563ac04cb41256535edff607cb27203c20c7968e4",
                "md5": "7bd47406ab0d23425a5b7a12301a99a3",
                "sha256": "a0d52e0cf5b04f20092e8c6e56310bd534e366e14293c8af44784a2f33e063e5"
            },
            "downloads": -1,
            "filename": "donald-2.0.1.tar.gz",
            "has_sig": false,
            "md5_digest": "7bd47406ab0d23425a5b7a12301a99a3",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.9",
            "size": 16457,
            "upload_time": "2025-07-11T09:44:54",
            "upload_time_iso_8601": "2025-07-11T09:44:54.167741Z",
            "url": "https://files.pythonhosted.org/packages/7b/15/7744022af3fc0c42091563ac04cb41256535edff607cb27203c20c7968e4/donald-2.0.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-07-11 09:44:54",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "klen",
    "github_project": "donald",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "donald"
}
        
Elapsed time: 0.57779s