代码中常常遇到暴力关闭程序或者当不得不重启系统时 导致当前运行状态无法保存,对于这种情况可以使用signal的信号机制来实现状态的可控制。加上任务队列等工具可以实现系统的解耦合。代码如下:
import signal
import asyncio
class GracefulKiller:
is_kill_now = False
def __init__(self):
signal.signal(signal.SIGINT, self.exit_gracefully)
signal.signal(signal.SIGTERM, self.exit_gracefully)
signal.signal(signal.SIGKILL, self.exit_gracefully)
signal.signal(signal.SIGHUP, self.exit_gracefully)
def exit_gracefully(self, signum, frame):
self.is_kill_now = True
async def loop_task():
killer = GracefulKiller()
while 1:
print("主进程运行中") # 任务主体
if killer.is_kill_now:
break
await asyncio.sleep(2)
loop = asyncio.get_event_loop()
try:
loop.run_until_complete(loop_task())
finally:
loop.run_until_complete(
# see: https://docs.python.org/3/library/asyncio-eventloop.html#asyncio.AbstractEventLoop.shutdown_asyncgens
loop.shutdown_asyncgens())
loop.close()
其中对于上述的signal.SIGINT的含义,请参考这篇文章 linix下信号及其解释