AppLocker
Project description
AppLocker - Distributed Application Lock Manager
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
withstatements - Stale lock detection and recovery
Installation
pip install your-package-name
Prerequisites
- Python 3.8+
- Redis server
dgloganddgredispackages (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:
- Redis configuration dictionary (host, port, etc.)
- Your application name (used as part of the lock key)
- Optional parameters:
ttl: Lock time-to-live in seconds (default: 60)logger_: Custom logger instance
Advanced Configuration
You can customize the lock behavior by:
- Setting a specific lock key instead of the default
QUEUE:{application} - Adjusting the stale timeout for force-release operations
- 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
- Keep TTL reasonable - Set it long enough for your operations but not too long (default 60s is good for most cases)
- Always use context managers when possible for safer lock handling
- Check lock ownership before performing sensitive operations
- Monitor lock duration using
get_lock_duration()to optimize your TTL - Handle lock acquisition failures gracefully in your application
Troubleshooting
Common Issues
-
Can't acquire lock
- Check if another instance is running
- Verify Redis connection
- Check if a stale lock needs to be force-released
-
Unexpected lock release
- Ensure your operations complete within the TTL
- Check for network issues with Redis
-
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
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 dgapplock-2.0.0a2.tar.gz.
File metadata
- Download URL: dgapplock-2.0.0a2.tar.gz
- Upload date:
- Size: 15.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f7db4e525b207650fb917e4933ae2964281ae96c8c6b612fc569dc408f320185
|
|
| MD5 |
26f408b41bc83aeb24aa01e784cf798c
|
|
| BLAKE2b-256 |
29f28dca118239f39d1c9313a9b64067ac7fe1ce69c141fc74409313a2707aaf
|
File details
Details for the file dgapplock-2.0.0a2-py3-none-any.whl.
File metadata
- Download URL: dgapplock-2.0.0a2-py3-none-any.whl
- Upload date:
- Size: 20.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0629d99f4f52db3a86a46d34e8288e47349b91fd5aad09b03ebdbd42a75c5e10
|
|
| MD5 |
f5e8120836ea93adf1911dae6e9e6026
|
|
| BLAKE2b-256 |
a4621b695b4ceb64fd390eb78c2674470218fd14e9017940159b2c6e9f4d26f7
|