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