goh*_*ohu 5 python process sigint sigterm
我使用上下文管理器流式传输数据以在程序退出时关闭连接。我在后台将我的程序作为守护进程运行。
当守护进程被 SIGINT 或 SIGTERM 或 kill 命令发送的任何中断信号中断时,如何让上下文管理器处理这种情况?
我在 Raspberry Pi 和 Ubuntu 上运行 Python 3。
我已经看到了:如何在 Python 中捕获 SIGINT? 这很有帮助,但我不确定如何将它与 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()
Run Code Online (Sandbox Code Playgroud)
我在作为守护程序运行的脚本中使用该对象。是否有一种 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()
Run Code Online (Sandbox Code Playgroud)
您还应该查看PEP 419,这可能对您的设置有所帮助。至于您对线程的要求,如果没有更多信息,很难说清楚。
| 归档时间: |
|
| 查看次数: |
1026 次 |
| 最近记录: |