用子进程优雅地停止python守护进程

我正在尝试以传统的启动/停止/重新启动样式实现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函数(文件保留,日志记录未记录等)。我是否为子进程实现了错误的处理程序?有没有更好的方法来使多个侦听器具有单个控制点?


万千封印
浏览 225回答 1
1回答

慕容3067478

我想到了。该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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python