ss-utils-circuit-breaker
A Python async circuit breaker implementation with optional Redis (coredis) support for distributed state.
Installation
# Basic installation (in-memory state only)
uv add ss-utils-circuit-breaker
# With Redis support
uv add ss-utils-circuit-breaker[redis]
Quick Start
Basic Usage (In-Memory)
from ss_utils_circuit_breaker import CircuitBreaker, CircuitBreakerError
# Create a circuit breaker
breaker = CircuitBreaker(
name="my_api",
failure_threshold=5, # Open after 5 failures
recovery_timeout=60, # Try again after 60 seconds
)
@breaker
async def call_external_api():
# Your async API call here
async with httpx.AsyncClient() as client:
response = await client.get("https://api.example.com/data")
response.raise_for_status()
return response.json()
# Usage
try:
data = await call_external_api()
except CircuitBreakerError:
# Circuit is open - service is known to be unavailable
data = get_cached_data()
except Exception:
# Regular failure
pass
With Redis (Distributed State)
from ss_utils_circuit_breaker import RedisCircuitBreaker
# Create a Redis-backed circuit breaker
breaker = RedisCircuitBreaker(
name="my_api",
redis_url="localhost:6379",
namespace="circuit_breaker", # Redis key prefix
failure_threshold=5,
recovery_timeout=60,
)
@breaker
async def call_external_api():
# State is shared across all instances via Redis
pass
Circuit Breaker States
CLOSED (Normal)
│
▼ (failures >= threshold)
OPEN (Blocking)
│
▼ (after recovery_timeout)
HALF_OPEN (Testing)
│
├─► (success) ──► CLOSED
│
└─► (failure) ──► OPEN
- CLOSED: Normal operation. Calls pass through, failures are counted.
- OPEN: Circuit is tripped. Calls fail immediately with
CircuitBreakerError. - HALF_OPEN: After timeout, one test call is allowed. Success closes circuit, failure reopens it.
Configuration Example
import httpx
from ss_utils_circuit_breaker import CircuitBreaker
# Only count connection errors as failures
api_breaker = CircuitBreaker(
name="external_api",
failure_threshold=3,
recovery_timeout=30,
expected_exception=(httpx.ConnectError, httpx.TimeoutException),
)
@api_breaker
async def fetch_data():
async with httpx.AsyncClient(timeout=10.0) as client:
return await client.get("https://api.example.com/data")
Testing
# Run tests
uv run pytest
# With coverage
uv run pytest --cov
License
MIT
Release files for ss-utils-circuit-breaker 0.0.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| ss_utils_circuit_breaker-0.0.1.tar.gz | 109.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| ss_utils_circuit_breaker-0.0.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 114.0 kB
Release files / ss_utils_circuit_breaker-0.0.1.tar.gz
| Download URL | ss_utils_circuit_breaker-0.0.1.tar.gz |
|---|---|
| Size | 109.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
45e234fd5a0a0c52435e48ef043e83ab5e95f591bad63fdfb318e904ef1d07a2
|
|
BLAKE2b-256 checksum How to use checksums |
29fbbc1da3a28525163e153a9bde65fc8f8237714e31c5401f7b136dc05feb64
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.9.11 {"installer":{"name":"uv","version":"0.9.11"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / ss_utils_circuit_breaker-0.0.1-py3-none-any.whl
| Download URL | ss_utils_circuit_breaker-0.0.1-py3-none-any.whl |
|---|---|
| Size | 4.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
2c9abe86505a99cb526474d9cece49451d19063a57b66267e301a4361ce3e387
|
|
BLAKE2b-256 checksum How to use checksums |
83e48dbdce043874c5dc623e075d9ad4264c6daaab99a0024f2937d7a4dae4ea
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.9.11 {"installer":{"name":"uv","version":"0.9.11"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|