Skip to main content

Django Marathon helps manage single runner tasks that need to avoid concurrency issues, ensuring that tasks are executed without overlapping.

Requirements

  • Python 3.6+

  • Django 3.1+

Installation

You can install Django Marathon via pip:

pip install django-marathon

Add marathon to your Django project’s INSTALLED_APPS:

INSTALLED_APPS = [
    ...
    'marathon',
]

Features

  • Ensures single execution of tasks to avoid concurrency.

  • Easy integration with Django management commands.

How Django Marathon Works

Under the hood, Django Marathon uses a simple locking mechanism to prevent concurrent execution of tasks.

1. Lock Model: Single runner tasks will create a lock in the database, using the Lock model. A lock has unique name representing the tasks. It also has a timestamp indicating when the lock was created. Each task that needs to avoid concurrency will first have to check the lock table before running.

2. SingleRunnerCommand: This is a helper class that is designed to be used in Django management commands.

3. Lock Acquisition and Release: When a command using SingleRunnerCommand is executed, it first checks if a lock with the specified name exists. If it does, the command does not run. If no lock exists, the command proceeds, and a lock is created. Once the command completes, the lock is released, allowing future executions.

Usage With Django Management Commands

Define a tasks that should be run without concurrency.

SingleRunnerCommand is a base command class provided by Django Marathon to ensure that a management command does not run concurrently.

from marathon.commands import SingleRunnerCommand
from django.core.management.base import BaseCommand

class Command(SingleRunnerCommand, BaseCommand):
    help = 'Your command description here'

    def handle(self, *args, **options):
        self.stdout.write('Starting task...')
        # Your task logic here
        self.stdout.write('Task completed.')

Using the Locking Mechanism Outside Management Commands

Django Marathon’s locking mechanism can also be utilized outside of management commands.

Here’s a general approach: - Check if the lock exists - Create a new lock if not - Implement you task logic - Release the lock

In practice, we would typically do the first 2 steps together.

Example Implementation:

from marathon.models import Lock

def my_task():
    lock_name = "my-unique-task-lock"
    # Get the existing lock or create a new one
    lock, created = Lock.objects.get_or_create(name=lock_name)
    if not created:
        print("Task is already running, please try again later.")
        return
    try:
        # Your task logic here
        print("Task is running...")
    except Exception as e:
        print(f"An error occurred: {str(e)}")
    finally:
        # Release the lock
        lock.delete()
    print("Task completed successfully.")

Metadata

Release files for django-marathon 0.1

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

Source distribution (sdist)

Source distribution for django-marathon 0.1
File Size Uploaded
django_marathon-0.1.tar.gz 7.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for django-marathon 0.1
File Interpreter ABI Platform
django_marathon-0.1-py3-none-any.whl Python 3 none any Details

Total release size: 20.9 kB

Release files / django_marathon-0.1.tar.gz

Download URL django_marathon-0.1.tar.gz
Size 7.7 kB
Tags Source
SHA-256 checksum
How to use checksums
a9267ba6c18c86f606b210bd66b680499993b11c4ef853e1ed29433ed3ba4fc8
BLAKE2b-256 checksum
How to use checksums
c17cf72bff0a1c18b77b4ba48bb3b8fdefb1249249e516c28f3fc5b56ce2926c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/5.1.1 CPython/3.10.11

Release files / django_marathon-0.1-py3-none-any.whl

Download URL django_marathon-0.1-py3-none-any.whl
Size 13.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
2069b9726ee7b7f6cd0643ca0e8bdbea5fb79c4ec5a3167c19225ce14acb5625
BLAKE2b-256 checksum
How to use checksums
c9cec3083b84472906429dec1cb4a9cbbc749aa61083a11e46cd4d8a126bf7d8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/5.1.1 CPython/3.10.11

Release history Release notifications | RSS feed

This release

0.1 This release

2 release files

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