Django library for managing asynchronous tasks with scheduling and dependency management
Project description
Django Async Manager
Django library for managing asynchronous tasks with scheduling and dependency management.
Features
- Background Tasks: Run Django functions asynchronously in the background
- Task Scheduling: Schedule tasks to run at specific times using cron-like syntax
- Task Dependencies: Define dependencies between tasks to ensure proper execution order
- Priority Queues: Assign priorities to tasks and process them accordingly
- Automatic Retries: Configure automatic retries with exponential backoff for failed tasks
- Multiple Workers: Run multiple workers using threads or processes
- Task Timeouts: Set timeouts for long-running tasks
- Monitoring: Track task status, execution time, and errors
Installation
From PyPI
pip install django-async-manager
Quick Start
- Add
'django_async_manager'to yourINSTALLED_APPSin settings.py:
INSTALLED_APPS = [
# ...
'django_async_manager',
# ...
]
- Run migrations to create the necessary database tables:
python manage.py migrate django_async_manager
- Define a background task:
from django_async_manager.decorators import background_task
@background_task(priority="high", max_retries=3)
def process_data(user_id, data):
# Your long-running code here
return result
- Call the task asynchronously:
# This will create a task and return immediately
task = process_data.run_async(user_id=123, data={"key": "value"})
# You can check the task status later
print(f"Task status: {task.status}")
- Start a worker to process tasks:
python manage.py run_worker --num-workers=2
Scheduling Periodic Tasks
- Define your schedule in settings.py:
BEAT_SCHEDULE = {
'daily-report': {
'task': 'myapp.tasks.generate_daily_report',
'schedule': {
'hour': '0', # Run at midnight
'minute': '0',
},
'args': [],
'kwargs': {'send_email': True},
},
}
- Update the schedule in the database:
python manage.py update_beat_schedule
- Start the scheduler:
python manage.py run_scheduler
Advanced Usage
Task Dependencies
# Create a dependent task that will only run after task1 and task2 are completed
dependent_task = generate_report.run_async(dependencies=[task1, task2])
Task Queues
@background_task(queue="email")
def send_email(to, subject, body):
# Send email logic
pass
# Start a worker for the email queue
# python manage.py run_worker --queue=email
Worker Execution Modes
By default, workers run in thread mode, but you can also run them as separate processes:
# Run workers in thread mode (default)
python manage.py run_worker --num-workers=2 --queue=default
# Run workers in process mode
python manage.py run_worker --num-workers=2 --processes --queue=default
Thread mode is more memory-efficient but may be affected by Python's Global Interpreter Lock (GIL). Process mode provides true parallelism but uses more memory.
Timeout Configuration
@background_task(timeout=60) # 60 seconds timeout
def process_large_file(file_path):
# Process file
pass
Task Priority
You can assign different priority levels to tasks:
@background_task(priority="high") # Options: "low", "medium", "high", "critical"
def important_task():
# High priority operation
pass
Tasks are processed in order of priority, with higher priority tasks being executed first.
Retry Configuration
You can configure automatic retries for failed tasks:
@background_task(
max_retries=3, # Maximum number of retry attempts
retry_delay=60, # Initial delay between retries in seconds
retry_backoff=2.0 # Multiplier for increasing delay between retries
)
def unreliable_operation():
# Operation that might fail
pass
With the above configuration, retries would occur after 60s, 120s, and 240s (with exponential backoff).
Decorator Parameters Reference
The @background_task decorator accepts the following parameters:
@background_task(
priority="medium", # Task priority: "low", "medium", "high", "critical"
queue="default", # Queue name for task processing
dependencies=None, # Tasks that must complete before this task runs
autoretry=True, # Whether to automatically retry failed tasks
retry_delay=60, # Initial delay between retries in seconds
retry_backoff=2.0, # Multiplier for increasing delay between retries
max_retries=1, # Maximum number of retry attempts
timeout=300, # Maximum execution time in seconds
)
def my_task():
# Task implementation
pass
Logging Configuration
Django Async Manager uses Python's standard logging module to log information about task execution, scheduling, and errors. By default, the package configures basic logging for its management commands to ensure logs are visible even without explicit configuration.
Default Loggers
The package uses the following loggers:
django_async_manager.worker: For worker-related logs (task execution, errors)django_async_manager.scheduler: For scheduler-related logs (periodic tasks, scheduling)
Customizing Logging
To customize logging in your project, add the following configuration to your Django settings:
LOGGING = {
# Your existing logging configuration...
"formatters": {
"verbose": {
"format": "{asctime} - {levelname} - {name} - {message}",
"style": "{",
},
# Other formatters...
},
"handlers": {
"console": {
"level": "DEBUG",
"class": "logging.StreamHandler",
"formatter": "verbose",
},
"file": {
"level": "INFO",
"class": "logging.FileHandler",
"filename": "django_async_manager.log", # Customize the path as needed
"formatter": "verbose",
},
# Other handlers...
},
"loggers": {
"django_async_manager.worker": {
"handlers": ["console", "file"],
"level": "DEBUG",
"propagate": False,
},
"django_async_manager.scheduler": {
"handlers": ["console", "file"],
"level": "DEBUG",
"propagate": False,
},
# Other loggers...
},
}
This configuration will ensure that logs from Django Async Manager are properly captured and displayed in your project.
License
MIT License
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
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file django_async_manager-0.1.2.tar.gz.
File metadata
- Download URL: django_async_manager-0.1.2.tar.gz
- Upload date:
- Size: 30.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.10.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
23de6cea4a5187207a015af9eec6e417b759f0d9647218d301920825e59ef912
|
|
| MD5 |
ea83aed16ed07aca5e9c5b7d384b1ccf
|
|
| BLAKE2b-256 |
f4d45b293f24122f05055559632c3241f5a007ed43fad6722de840e239828097
|
File details
Details for the file django_async_manager-0.1.2-py3-none-any.whl.
File metadata
- Download URL: django_async_manager-0.1.2-py3-none-any.whl
- Upload date:
- Size: 38.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.10.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a68b066709665739cd2ca7383fca012dedd2e4e91cd88ae61429fbda39174f0a
|
|
| MD5 |
c1c30b2dccb6d1a6ffc9d2ecc91c40aa
|
|
| BLAKE2b-256 |
12c7ff6b011c902662153bab4287366df6e8f7f5d51b78d1b1234778a58a1a54
|