import trio import gc class RAII: def __del__(self): print('Goodbye.') class InefficientReader: def __init__(self): self._remaining = b'1' * 256 * 1024 * 1024 async def _iter_head(self): raii = RAII() head = self._remaining[:16] remaining = self._remaining[16:] self._remaining = remaining[:] yield head yield self._remaining assert raii async def get_head(self): async for chunk in self._iter_head(): return chunk async def iterate(): reader = InefficientReader() for i in range(20): print(i) chunk = await reader.get_head() if not chunk: break gc.collect() def test(): trio.run(iterate)