import asyncio import logging import signal loop = None def create_task(coro): global loop loop.create_task(coro) async def shutdown(sig, loop): log = logging.getLogger() log.info(f"Received exit signal {sig.name}...") tasks = [t for t in asyncio.all_tasks() if t is not asyncio.current_task()] [task.cancel() for task in tasks] log.info(f"Cancelling {len(tasks)} outstanding tasks") await asyncio.wait_for(loop.shutdown_asyncgens(), timeout=10) loop.stop() log.info("Shutdown complete.") def init_loop(): global loop loop = asyncio.get_event_loop() loop.add_signal_handler(signal.SIGTERM, lambda: asyncio.create_task(shutdown(signal.SIGTERM, loop))) loop.add_signal_handler(signal.SIGINT, lambda: asyncio.create_task(shutdown(signal.SIGINT, loop))) return loop