我正在尝试以传统的启动/停止/重新启动样式实现python守护程序,以将使用者控制在消息传递队列中。我已经成功地使用python-daemons创建了一个使用者,但是我需要多个监听器来处理大量消息。这导致我在run函数以及os.kill对stop函数的调用中实现了多处理库:def run(self): for num in range(self.num_instances): p = multiprocessing.Process(target=self.start_listening) p.start()def start_listening(self): with open('/tmp/pids/listener_{}.pid'.format(os.getpid()), 'w') as f: f.write("{}".format(os.getpid())) while True: // implement message queue listener这几乎可以,但是我真的很想让子进程正常关闭并做一些清理,包括日志记录。我了解了信号处理程序,因此我将其切换signal.SIGTERM到signal.SIGINT并将其添加到守护程序类。但是,在测试时,子进程将被杀死,但似乎从未调用过graceful_stop函数(文件保留,日志记录未记录等)。我是否为子进程实现了错误的处理程序?有没有更好的方法来使多个侦听器具有单个控制点?
1 回答

慕容3067478
TA贡献1773条经验 获得超3个赞
我想到了。该signal.signal声明必须明确地放在每个子进程的start_listening函数中。
def start_listening(self):
signal.signal(signal.SIGINT, self.graceful_stop)
with open('/tmp/pids/listener_{}.pid'.format(os.getpid()), 'w') as f:
f.write("{}".format(os.getpid()))
while True:
// implement message queue listener
添加回答
举报
0/150
提交
取消