繁体   English   中英

如何使 python 上下文管理器捕获 SIGINT 或 SIGTERM 信号

[英]How to make a python context manager catch a SIGINT or SIGTERM signal

我 stream 数据使用上下文管理器在程序退出时关闭连接。 我在后台将我的程序作为守护进程运行。

当守护程序被 SIGINT 或 SIGTERM 或 kill 命令发送的任何中断信号中断时,如何让上下文管理器处理这种情况?

我在树莓派和 Ubuntu 上运行 Python 3。

更新

我已经看到了: How do I capture SIGINT in Python? 哪个有帮助,但我不确定如何将它与 python 的上下文管理器一起使用? IE。 假设我有一个作为上下文管理器构建的 object:

class Sensor:

    def __init__(self, name: str):
        self.name = name

    def __enter__(self):
        self._connect()
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.close()

我在作为守护进程运行的脚本中使用了 object。 是否有一种 pythonic 方法来指定指定 __ exit__ function 也必须在 SIGINT 和 SIGTERM 异常上调用?

抱歉,如果没有正确理解异常和信号中断在 python 中的工作原理,并且我的问题没有意义

您可以为调用sys.exit()的上下文管理器创建一个内部方法(例如_handle_interrupt ),并在调用__enter__后将其注册为信号处理程序:

class Sensor:

    def __init__(self, name: str):
        self.name = name

    def _handle_interrupt(self):
       sys.exit()  # will trigger a exception, causing __exit__ to be called

    def __enter__(self):
        signal.signal(signal.SIGINT, self._handle_interrupt)
        signal.signal(signal.SIGTERM, self._handle_interrupt)
        self._connect()
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.close()

您还应该查看PEP 419 ,这可能对您的设置有所帮助。 至于您对线程的要求,如果没有更多信息,很难说清楚。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM