为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

万千封印 2021-03-30 17:19:19
我正在尝试以传统的启动/停止/重新启动样式实现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


查看完整回答
反对 回复 2021-04-09
  • 1 回答
  • 0 关注
  • 224 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号