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