
[英]signal.signal receives sigint/sigterm when child process ends
[英]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.