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