30 lines
842 B
Python
30 lines
842 B
Python
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
|