Python закрывает детей при закрытии основного процесса - PullRequest
2 голосов
/ 16 ноября 2011

У меня есть основной процесс, который разветвляет несколько подпроцессов.Я хочу иметь возможность убивать эти дочерние процессы, когда мой основной процесс получает сигнал уничтожения.В идеале я хотел бы сделать что-то вроде:

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

Но, конечно, это не работает ... какие-либо предложения?

Ответы [ 2 ]

3 голосов
/ 16 ноября 2011

Как подсказал @ Тони , вы можете установить флаг daemon=True для дочернего процесса, созданного с использованием модуля multiprocessing.Чтобы установить его на 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()
1 голос
/ 16 ноября 2011

Как насчет использования этого флага при создании подпроцесса?

...