Name | donald JSON |
Version |
2.0.1
JSON |
| download |
home_page | None |
Summary | Task manager for asyncio |
upload_time | 2025-07-11 09:44:54 |
maintainer | None |
docs_url | None |
author | None |
requires_python | >=3.9 |
license | MIT 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"
}