AIMD-based adaptive throttling for asyncio, thread pools, and Kafka consumers — like a semaphore with a brain.
Project description
ACE Documentation Index
ACE v0.1.0 - Adaptive Concurrency Engine
Getting Started (30 minutes)
- Install -
pip install ace-concurrency - Quick Start - Run async example
- Configuration - Customize AIMD parameters
- Observability - Monitor via JSON logs
Core Concepts
System Signals
Monitored every 2 seconds:
- CPU utilization (%)
- Memory utilization (%)
- Event loop lag (milliseconds)
- Queue depth (tasks waiting)
- Kafka consumer lag (optional)
Decision Types
- INCREASE: Proactive (low load) or reactive (queue catching up)
- DECREASE: High CPU/memory or queue overflow
- HOLD: Steady state, system healthy
Integration Guides
Async Tasks
Best for: I/O-bound work (API calls, database queries)
async with ACEAsyncioManager(config) as mgr:
await mgr.submit(your_async_task())
Thread Pools
Best for: CPU-bound work (calculations, data processing)
with ACEThreadPoolManager(config) as mgr:
mgr.submit(your_sync_function)
Kafka Consumers
Best for: Event streaming with backpressure
async with ACEKafkaConsumerManager(config, "topic") as mgr:
await mgr.process_async(handler)
Configuration Guide
Basic Configuration
config = AIMDConfig(
min_limit=1,
max_limit=100,
initial_limit=10,
)
Advanced Configuration
config = AIMDConfig(
# Concurrency bounds
min_limit=5,
max_limit=200,
initial_limit=50,
# AIMD parameters
increase_step=5, # More aggressive increase
decrease_factor=0.3, # Faster decrease
# Thresholds (CPU/Memory %)
cpu_threshold=75.0,
memory_threshold=80.0,
cpu_increase_threshold=30.0, # Earlier proactive scaling
memory_increase_threshold=40.0,
# Timing (seconds)
adjustment_interval=1, # More frequent decisions
cooldown_period=10, # Longer wait after decrease
)
Monitoring & Observability
Structured JSON Logs
{
"timestamp": "2026-01-16T14:30:45Z",
"level": "INFO",
"message": "AIMD decision",
"decision": "INCREASE",
"current_limit": 10,
"new_limit": 12,
"signals": {
"cpu_percent": 35.5,
"memory_percent": 42.3,
"queue_depth": 5,
"event_loop_lag_ms": 2.1
}
}
Metrics to Track
- Current concurrency limit
- Active task count
- CPU/Memory utilization
- Decision frequency (INCREASE/DECREASE/HOLD)
- System response time
Version Information
| Property | Value |
|---|---|
| Package | ace-concurrency |
| Version | 0.1.0 |
| Python | 3.8+ |
| License | MIT |
| Status | Production-Ready |
| PyPI | https://pypi.org/project/ace-concurrency/ |
Common Tasks
Task: Change concurrency limits
# During runtime (if you need dynamic adjustment)
with ACEAsyncioManager(config) as mgr:
# Limits controlled automatically by AIMD
# To override, set directly:
# Not recommended - trust AIMD algorithm
pass
Task: Access current limit
async with ACEAsyncioManager(config) as mgr:
print(f"Current limit: {mgr.current_limit}")
print(f"Active tasks: {mgr.active_tasks}")
Task: Custom signal collection
from ace.core.signals import SignalCollector
collector = SignalCollector()
collector.set_queue_depth(len(my_queue))
signals = await collector.collect_all_async()
Task: Batch multiple AIMD managers
# Multiple independent managers (recommended for isolation)
async with ACEAsyncioManager(config1) as mgr1:
async with ACEAsyncioManager(config2) as mgr2:
# Separate control loops
pass
Support Resources
- Bug Reports: GitHub Issues
- Feature Requests: GitHub Discussions
- Code Examples: See
intergrations/directory
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 ace_concurrency-0.1.1.tar.gz.
File metadata
- Download URL: ace_concurrency-0.1.1.tar.gz
- Upload date:
- Size: 12.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e0ad36381f94f0bf31c4081807afa11ff5881e4c6654d906f00430d3e7f9665c
|
|
| MD5 |
58370650c3bf18d29eac3e1870e82e5e
|
|
| BLAKE2b-256 |
3eee4858a530e45e8e87f5bbdb8b38cfbbe931e4a8fc2c0acbf99705ce665386
|
File details
Details for the file ace_concurrency-0.1.1-py3-none-any.whl.
File metadata
- Download URL: ace_concurrency-0.1.1-py3-none-any.whl
- Upload date:
- Size: 14.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d3285a78fa6526e831d2a9f1e2bc94b718cdfadedaa82cd7fc3b33c55553d247
|
|
| MD5 |
9a570562972a23b750e1805bf7cfa875
|
|
| BLAKE2b-256 |
72bc42df9858ec6eb5a4a558c246d375eb2e024f6eae485f4afbe2fc01b303a0
|