【问题标题】:Python close children when closing main processPython在关闭主进程时关闭子进程
【发布时间】:2011-12-30 07:43:55
【问题描述】:

我有一个主进程,它分叉了许多子进程。当我的主进程收到终止信号时,我希望能够终止这些子进程。理想情况下,我想做一些类似的事情:

def handler(signum, frame, pid_list):
    log('Killing Process')
    for pid in pid_list:
       os.kill(pid, signal.SIGTERM)
       os.waitpid(pid, 0)         # need
    sys.exit()

if __name__ == "__main__":
    <code that creates child processes, pids>
    signal.signal(signal.SIGTERM, handler(pid_list))

当然,这行不通……有什么建议吗?

【问题讨论】:

    标签: python fork parallel-processing signals kill


    【解决方案1】:

    作为@tony suggested,您可以在使用multiprocessing 模块创建的子进程上设置daemon=True 标志。要将其安装在 python2.4 上,请键入:pip install multiprocessing

    如果主进程被信号杀死,子进程不会被终止,因此您需要提供适当的信号处理程序:

    #!/usr/bin/env python
    import logging, signal, sys, time
    import multiprocessing as mp # `pip install multiprocessing` on Python <2.6
    
    class AddProcessNameFilter(logging.Filter):
        """Add missing on Python 2.4 `record.processName` attribute."""
        def filter(self, r):
            r.processName = getattr(r, 'processName', mp.current_process().name)
            return logging.Filter.filter(self, r)
    
    def print_dot():
        while True:
            mp.get_logger().info(".")
            time.sleep(1)
    
    def main():
        logger = mp.log_to_stderr()
        logger.setLevel(logging.INFO)
        logger.addFilter(AddProcessNameFilter()) # fix logging records
    
        # catch TERM signal to allow finalizers to run and reap daemonic children
        signal.signal(signal.SIGTERM, lambda *args: sys.exit(-signal.SIGTERM))
    
        # create daemonic child processes
        processes = [mp.Process(target=print_dot) for _ in range(2)]
        for p in processes:
            p.daemon = True
            p.start()    
        print_dot()
    
    if __name__=="__main__":
        mp.freeze_support()
        main()
    

    【讨论】:

    • 您好 J.F.,感谢您提供有关 pip'ing 多处理器的指针;我无意在 Centos 上安装 Python 2.6,但这可能只是解决问题。明天我会试一试,然后给你一些反馈。
    • 顺便说一句,大名鼎鼎
    • 好的,这很好用,给其他尝试这个的人一些建议: 1. p.daemon 需要与 signal.signal 配对,p.daemon 不只是自己做. 2. 在 Centos 上安装多处理:yum install python-pip gcc python-devel && pip-python install multiprocessing。再次感谢 J.F.
    【解决方案2】:

    在创建子进程时使用this 标志怎么样?

    【讨论】:

    • 嗯,谢谢@tony,但我没有使用多处理类...据我所知,它仅适用于 python 2.6,我在 Centos 5.7 下运行 python 2.4.3。
    猜你喜欢
    • 2013-07-19
    • 2017-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-11
    • 2015-09-15
    • 1970-01-01
    • 2017-03-31
    相关资源
    最近更新 更多