Overview
TheQueueManager class controls concurrent operations with per-user limiting. It prevents server overload and ensures fair resource allocation across users.
Location: misc/queue_manager.py
Architecture
QueueManager is a singleton that tracks active requests per user. It uses asyncio locks for thread-safe operation and provides context managers for automatic resource cleanup.
Design Pattern
- Singleton: One instance shared across the application
- Context Manager: Automatic acquisition and release
- Per-User Tracking: Independent limits per user/chat
Class Definition
max_user_queue- Maximum concurrent requests per user_user_info_counts- Dict mapping user_id to active request count_lock- Asyncio lock for thread-safe operations
Methods
get_instance()
Location: misc/queue_manager.py:54
Gets or creates the singleton instance.
QueueManager singleton instance
Example:
reset_instance()
Location: misc/queue_manager.py:64
Resets the singleton instance (useful for testing).
get_user_queue_count()
Location: misc/queue_manager.py:68
Gets current active request count for a user.
user_id- Telegram user/chat ID
acquire_info_for_user()
Location: misc/queue_manager.py:72
Acquires a queue slot for a user.
user_id- Telegram user/chat IDbypass_user_limit- If True, skip limit check (for inline downloads)
True if slot acquired, False if limit exceeded
Example:
release_info_for_user()
Location: misc/queue_manager.py:103
Releases a queue slot for a user.
user_id- Telegram user/chat ID
acquire_info_for_user() or use info_queue() context manager
info_queue() (Context Manager)
Location: misc/queue_manager.py:120
Context manager for automatic queue slot management.
user_id- Telegram user/chat IDbypass_user_limit- If True, skip limit check
True if slot acquired, False if limit exceeded
Ensures: Automatic release in finally block
Example:
active_users_count (Property)
Location: misc/queue_manager.py:148
Gets number of users with active requests.
Configuration
Queue settings are configured viadata/config.py:
MAX_USER_QUEUE_SIZE
Usage Patterns
Standard Download Handler
Inline Download Handler
Why Per-User Limits?
Without Limits:- One user could spam requests
- Server resources exhausted
- Other users blocked
- Fair resource allocation
- Prevents abuse
- Better user experience for all
- Inline downloads use
bypass_user_limit=True - Allows inline queries even when user’s regular queue is full
- Prevents inline query failures
Thread Safety
All operations useasyncio.Lock for thread safety:
- No race conditions
- Accurate counts
- Safe concurrent access
Logging
Queue operations are logged for debugging:Best Practices
- Always use context manager - Ensures automatic cleanup
- Pre-check before acquiring - Better UX (show error earlier)
- Use bypass sparingly - Only for inline downloads
- Set reasonable limits - Balance throughput and fairness (default: 3)
- Handle acquisition failure - Always check
acquiredflag - Don’t hold slots unnecessarily - Keep work inside context manager minimal
- Use get_instance() - Never create QueueManager directly

