reworked run()
This commit is contained in:
parent
9c61b297d3
commit
021d35be6a
1 changed files with 28 additions and 18 deletions
|
@ -1,6 +1,8 @@
|
||||||
import asyncio
|
import asyncio
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
|
from signal import signal, SIGINT, SIGTERM, SIGABRT
|
||||||
|
|
||||||
class Runnable:
|
class Runnable:
|
||||||
|
|
||||||
async def start(self):
|
async def start(self):
|
||||||
|
@ -9,27 +11,35 @@ class Runnable:
|
||||||
async def stop(self, force:bool=False):
|
async def stop(self, force:bool=False):
|
||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
|
|
||||||
|
async def _stop_wrapper(self):
|
||||||
|
done, pending = await asyncio.wait(self.stop(), FORCE_QUIT.wait(), return_when=asyncio.FIRST_COMPLETED)
|
||||||
|
if FORCE_QUIT.is_set(): # means previous stop() didn't finish and user sent another SIGINT
|
||||||
|
await self.stop(force=True)
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
|
logging.info("Starting process")
|
||||||
|
|
||||||
|
DONE = asyncio.Event()
|
||||||
|
FORCE_QUIT = asyncio.Event()
|
||||||
|
|
||||||
|
def signal_handler():
|
||||||
|
if DONE.is_set():
|
||||||
|
logging.info("Received SIGINT, terminating")
|
||||||
|
FORCE_QUIT.set()
|
||||||
|
else:
|
||||||
|
logging.info("Received SIGINT, stopping gracefully...")
|
||||||
|
DONE.set()
|
||||||
|
|
||||||
|
signal(SIGINT, signal_handler)
|
||||||
|
|
||||||
loop = asyncio.get_event_loop()
|
loop = asyncio.get_event_loop()
|
||||||
|
|
||||||
logging.info("Starting")
|
async def main():
|
||||||
|
await self.start()
|
||||||
|
await DONE.wait()
|
||||||
|
await self._stop_wrapper()
|
||||||
|
|
||||||
loop.run_until_complete(self.start())
|
loop.run_until_complete(main())
|
||||||
|
|
||||||
async def idle():
|
logging.info("Process finished")
|
||||||
never = asyncio.Event()
|
|
||||||
logging.info("Idling")
|
|
||||||
await never.wait()
|
|
||||||
|
|
||||||
try:
|
|
||||||
loop.run_until_complete(idle())
|
|
||||||
except KeyboardInterrupt:
|
|
||||||
logging.info("Received SIGINT, stopping...")
|
|
||||||
try:
|
|
||||||
loop.run_until_complete(self.stop())
|
|
||||||
except KeyboardInterrupt:
|
|
||||||
logging.info("Received SIGINT, stopping for real")
|
|
||||||
loop.run_until_complete(self.stop(force=True))
|
|
||||||
|
|
||||||
logging.info("Done")
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue