gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 19:09:23 24 4
gpt4 key购买 nike

我使用上下文管理器流式传输数据以在程序退出时关闭连接。我在后台将我的程序作为守护进程运行。
当守护进程被 SIGINT 或 SIGTERM 或 kill 命令发送的任何中断信号中断时,如何让上下文管理器处理这种情况?
我在 Raspberry Pi 和 Ubuntu 上运行 Python 3。
更新
我见过这个:How do I capture SIGINT in Python?
这很有帮助,但我不确定如何将它与 python 的上下文管理器一起使用? IE。假设我有一个作为上下文管理器构建的对象:

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()
我在作为守护程序运行的脚本中使用该对象。是否有一种 pythonic 方法来指定 __ exit__ 函数也必须在 SIGINT 和 SIGTERM 异常上调用?
对不起,如果没有正确理解异常和信号中断在 python 中是如何工作的,我的问题没有意义

最佳答案

您可以为调用 _handle_interrupt 的上下文管理器创建一个内部方法(例如 sys.exit() )并将其注册为信号处理程序一次 __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 ,这可能对您的设置有所帮助。
至于您对线程的要求,如果没有更多信息,很难说。

关于python - 如何让 python 上下文管理器捕获 SIGINT 或 SIGTERM 信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62642768/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com