2011-11-16 82 views
2

我有一個主進程分叉了一些子進程。我希望能夠在我的主進程獲得終止信號時關閉這些子進程。理想情況下,我想要做一些沿線:Python在關閉主進程時關閉孩子

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

但當然,這不工作......任何建議?

回答

3

As @tony suggested您可以在使用multiprocessing模塊創建的子進程上設置daemon=True標誌。要在python2.4上安裝它,請鍵入:pip install multiprocessing。如果主要過程是由一個信號終止,所以你需要提供適當的信號處理

子進程不會被終止:@tony

#!/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

嗨J.F.,感謝關於pip'ing多處理器的指針;我沒有打算在Centos上安裝Python 2.6,但這可能只是一個竅門。我明天會放棄它並給你一些反饋。 –

+1

偉大的名字句柄,順便說一句 –

+1

好的,所以這個效果很好,其他人嘗試這樣做的一些指針:1. p.daemon需要與signal.signal配對,p.daemon不只是做它的擁有。 2.在Centos上安裝多處理:yum install python-pip gcc python-devel && pip-python install multiprocessing。再次感謝J.F. –

1

當您創建子流程時,使用this標誌怎麼辦?

+1

嗯,謝謝你,但我沒用過多處理類...從我可以看到它只能從python 2.6中得到,我在Centos 5.7下運行python 2.4.3。 –