Python 在关闭主进程时关闭子进程

发布于 2024-12-15 17:14:58 字数 442 浏览 5 评论 0原文

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

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))

但是当然,这不起作用......有什么建议吗?

I have have a main process that forks a number of subprocesses. I want to be able to kill these child processes off when my main process gets the kill signal. Ideally I would want to do something along the lines of:

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))

But of course, that doesn't work... any suggestions?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

江南月 2024-12-22 17:14:58

正如 @tony 建议 你可以设置 使用 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()

As @tony suggested you could set daemon=True flag on a child process created using multiprocessing module. To install it on python2.4, type: pip install multiprocessing.

The child processes won't be terminated if the main process is killed by a signal so you need to provide an appropriate signal handler:

#!/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()
做个ˇ局外人 2024-12-22 17:14:58

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

What about use this flag when you create a subprocess?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文