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()