Python - 捕获由第三方模块捕获的SIGTERM并传播到脚本的方法

问题描述 投票:0回答:1

我正在运行一个简单的Python脚本,该脚本从Kafka流中读取,该流使用用C编写的底层库(称为libidb)。脚本连续读取此流。

对于特定的调试目的,我需要在脚本终止时以JSON格式转储字典。我已经使用signal模块从脚本中捕获SIGINTSIGTERM并定义了一个函数来调用这些信号来转储输出。但问题是我的脚本花费大部分时间使用库(用于读/写)我指的是最终捕获信号并且它不会传播到脚本。结果是我的信号处理程序没有在这里使用。如何确保捕获的信号传播到解释器,然后调用相应的信号处理程序。

请注意,idb是内部模块,在标准Python包中不可用。

import signal
import json
import idb

def dump_dict_to_JSON():
    __location__ = os.path.realpath(os.path.join(os.getcwd(), os.path.dirname(__file__)))
    f = open(os.path.join(__location__, 'dict_map'), 'w');
    f.write(json.dumps(my_dict))
    f.close()



def idb_handler():
    print('I can do whatever with the message from stream')

if __name__ == "__main__":
    signal.signal(signal.SIGTERM, dump_dict_to_JSON)
    signal.signal(signal.SIGINT, dump_dict_to_JSON)

    db_consumer = idb.AsyncConsumer(istream, idb_handler)

我在Centos 7上使用Python 2.7.5

python python-2.7 signals
1个回答
0
投票

内核中每个信号只有一个信号处理程序。基本上它意味着最后安装的人看到了中断。

根据信号类型和其他情况,处理程序可以设计为以菊花链的形式调用先前安装的处理程序。

在上述图书馆中显然不是这种情况。

作为一种解决方法,您应该在初始化库之后安装处理程序,并在转储JSON时调用它们的处理程序。

© www.soinside.com 2019 - 2024. All rights reserved.