2014-04-01 13 views
8

Używam modułu przetwarzania wieloprocesowego do przetwarzania równoległego. Bellow code snippet wyszukuje nazwę pliku w lokalizacji X i zwraca nazwę pliku, w którym znaleziono ciąg znaków. Ale w niektórych przypadkach proces wyszukiwania trwa długo, więc próbowałem zabić proces wyszukiwania z ponad 300 sekundami. Dla tego, że wykorzystałem timeout == 300 jako podane poniżej, to zabija proces wyszukiwania, ale to go zabija proces potomny odradza się za pomocą kodu mieszkowego.Proces automatycznego zabijania i proces potomny wieloprocesorowego puli

Próbowałem znaleźć wiele sposób, ale bez powodzenia:/

Jak mogę zabić proces macierzysty from pool wraz z jego procesem potomnym?

import os 
from multiprocessing import Pool 

def runCmd(cmd): 
    lresult = os.popen(cmd).read() 
    return lresult 

main(): 
    p = Pool(4) 
    data_paths = [list of paths of store data] 
    search_cmds = [ "SearchText.exe %s < %s"%(data_path, filename) for data_path in data_paths ] 
    results = [p.apply_async(runCmd, (cmd,), callback = log_result) for cmd in search_cmds] 
    try: 
     for result in results: 
      root.append(result.get(timeout=300)) 
     #rool holds the result of search process 
    except TimeoutError: 
     for c in multiprocessing.active_children(): 
      print '----->',c.pid 
      os.kill(c.pid, signal.SIGTERM) 
    p.close() 
    p.join() 

if __name__ == '__main__': 
    main() 

Process Tree in Process Explorer:

cmd.exe 
------python.exe 
----------------python.exe 
--------------------------cmd.exe 
---------------------------------SearchText.exe 
----------------python.exe 
--------------------------cmd.exe 
---------------------------------SearchText.exe 
----------------python.exe 
--------------------------cmd.exe 
---------------------------------SearchText.exe 
----------------python.exe 
--------------------------cmd.exe 
---------------------------------SearchText.exe 

powyżej fragmencie kodu dosnt zabić procesu potomnego

--------------------------cmd.exe 
---------------------------------SearchText.exe 
--------------------------cmd.exe 
---------------------------------SearchText.exe 
--------------------------cmd.exe 
---------------------------------SearchText.exe 
--------------------------cmd.exe 
---------------------------------SearchText.exe 

Tezy dziecko proces wyszukiwania zachować, to proces potomny również zginąć.

Proszę gildii.

Dzięki

Odpowiedz

7

jestem w stanie rozwiązać mój problem za pomocą modułu psutil

Znaleziono rozwiązanie na poniżej postu:

import psutil, os 

def kill_proc_tree(pid, including_parent=True):  
    parent = psutil.Process(pid) 
    for child in parent.get_children(recursive=True): 
     child.kill() 
    if including_parent: 
     parent.kill() 

me = os.getpid() 
kill_proc_tree(me) 

https://stackoverflow.com/a/4229404/420557

+3

get_children już nie istnieje metoda nazywa się [dzieci] (http://pythonhosted.org/psutil/#psu til.Process.children) – user37203

+0

Użyłem daemonize, więc to podejście było dokładnie tym, czego szukałem. – crsuarezf