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:

.. code-block:: python

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

.. code-block:: python

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