Python下对信号的捕获以及优雅的处理

代码中常常遇到暴力关闭程序或者当不得不重启系统时 导致当前运行状态无法保存,对于这种情况可以使用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下信号及其解释

你可能感兴趣的:(计算机理论基础,python编程,Centos基础,python,信号处理)