Skip to main content

AppLocker

Project description

AppLocker - Distributed Application Lock Manager

Python Version Redis Required

Overview

AppLocker is a Python library that provides distributed application locking using Redis. It ensures that only one instance of your application can run a critical section of code at a time, even across multiple servers.

Key features:

  • Distributed locking across multiple application instances
  • Automatic lock renewal (heartbeat) to prevent premature expiration
  • Lock ownership verification to prevent accidental release
  • Context manager support for easy use in with statements
  • Stale lock detection and recovery

Installation

pip install your-package-name

Prerequisites

  • Python 3.8+
  • Redis server
  • dglog and dgredis packages (will be installed automatically if using pip)

Quick Start

from app_locker import AppLocker

# Configure Redis connection
redis_config = {
    "host": "localhost",
    "port": 6379,
    # Add other Redis parameters as needed
}

# Create a locker instance
locker = AppLocker(redis_config, "my_application")

# Usage example
with locker:
    print("This code is protected by a distributed lock")
    # Only one instance of your application can execute this at a time

Configuration

Basic Configuration

When creating an AppLocker instance, you need to provide:

  1. Redis configuration dictionary (host, port, etc.)
  2. Your application name (used as part of the lock key)
  3. Optional parameters:
    • ttl: Lock time-to-live in seconds (default: 60)
    • logger_: Custom logger instance

Advanced Configuration

You can customize the lock behavior by:

  1. Setting a specific lock key instead of the default QUEUE:{application}
  2. Adjusting the stale timeout for force-release operations
  3. Providing a custom logger for tracking lock operations

Usage Examples

Basic Locking

if locker.acquire():
    try:
        # Critical section
        print("Doing important work")
    finally:
        locker.release()
else:
    print("Could not acquire lock - another instance is running")

Context Manager

with locker.acquired():
    # Critical section
    print("This code is protected")

Checking Lock Status

if locker.is_my_lock():
    print("We currently hold the lock")
    
lock_info = locker.get_lock_info()
if lock_info:
    print(f"Lock held by {lock_info['owner']} since {lock_info['acquired_at']}")

Force Release Stale Lock

if locker.force_release_if_stale(stale_timeout=120):
    print("Released a stale lock")

Best Practices

  1. Keep TTL reasonable - Set it long enough for your operations but not too long (default 60s is good for most cases)
  2. Always use context managers when possible for safer lock handling
  3. Check lock ownership before performing sensitive operations
  4. Monitor lock duration using get_lock_duration() to optimize your TTL
  5. Handle lock acquisition failures gracefully in your application

Troubleshooting

Common Issues

  1. Can't acquire lock

    • Check if another instance is running
    • Verify Redis connection
    • Check if a stale lock needs to be force-released
  2. Unexpected lock release

    • Ensure your operations complete within the TTL
    • Check for network issues with Redis
  3. Permission errors

    • Verify Redis credentials in your configuration

Logging

AppLocker provides detailed logging about lock operations. If you're not seeing logs:

  • Make sure logging is configured properly
  • Pass a custom logger to the constructor if needed

API Reference

See the full API documentation for detailed information about all available methods and parameters.

License

MIT License

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

dgapplock-2.0.0a0.tar.gz (15.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

dgapplock-2.0.0a0-py3-none-any.whl (19.8 kB view details)

Uploaded Python 3

File details

Details for the file dgapplock-2.0.0a0.tar.gz.

File metadata

  • Download URL: dgapplock-2.0.0a0.tar.gz
  • Upload date:
  • Size: 15.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for dgapplock-2.0.0a0.tar.gz
Algorithm Hash digest
SHA256 aa04e81f97bc42f0397151a66e4a1027c53e292fe522690d8f569d3b53609aac
MD5 664077bfc6e4f561fbdb1a768a9df48b
BLAKE2b-256 55a75b44fe70d4074544d75b1e4cb509f359625fda4e8e7359f1c3a2891c3cf6

See more details on using hashes here.

File details

Details for the file dgapplock-2.0.0a0-py3-none-any.whl.

File metadata

  • Download URL: dgapplock-2.0.0a0-py3-none-any.whl
  • Upload date:
  • Size: 19.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for dgapplock-2.0.0a0-py3-none-any.whl
Algorithm Hash digest
SHA256 df77b193967f14e5dc6ea041a7032758be146c070fda7effdf7c4840523973cf
MD5 70d59f72e891a48c9ca516ddb93f8be0
BLAKE2b-256 6361ee40e6bd95300ecc06b3a8f82f321a97a9f56f3f465a5efd9b463ebb56c3

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page