import asyncio from itertools import count async def position_stream(): try: for position in count(): await asyncio.sleep(1) yield position finally: print("position stream cancelled") async def altitude_stream(): try: for altitude in count(): await asyncio.sleep(1) yield altitude finally: print("altitude stream cancelled") async def print_position(): async for position in position_stream(): print(f"position: {position}") if position == 2: cleanup() async def print_altitude(): async for altitude in altitude_stream(): print(f"altitude: {altitude}") def cleanup(): loop = asyncio.get_event_loop() asyncio.ensure_future(loop.shutdown_asyncgens()) loop.close() if __name__ == '__main__': try: asyncio.ensure_future(print_position()) asyncio.ensure_future(print_altitude()) asyncio.get_event_loop().run_forever() except KeyboardInterrupt: pass