redis.asyncio pattern¶
Keep redis.asyncio work async. Do not move async Redis clients into a thread
pool.
Good pattern¶
Use async Redis commands directly:
async for field, _value in master_conn.hscan_iter(
key,
match="alarm::*",
count=500,
):
...
Use leasepool only for synchronous CPU or blocking work around the Redis flow.
Example¶
import json
from leasepool import LeasedExecutorManager
def normalize_payload(raw: str) -> dict:
payload = json.loads(raw)
return {"id": str(payload["id"])}
async def normalize_many(raw_payloads: list[str]) -> list[dict]:
manager = LeasedExecutorManager(
backend="thread",
max_pools=1,
min_pools=1,
workers_per_pool=4,
)
await manager.start()
try:
async with await manager.acquire(owner="normalize") as lease:
return await asyncio.gather(
*(lease.run(normalize_payload, raw) for raw in raw_payloads)
)
finally:
await manager.stop()