2014-04-01 18 views
8

Utilizzo un modulo di elaborazione multipla per l'elaborazione parallela. Snippet di codice a soffietto cerca il nome file della stringa in posizione X e restituisce il nome del file in cui è stata trovata la stringa. Ma in alcuni casi ci vuole molto tempo per cercare il processo quindi stavo cercando di uccidere il processo di ricerca con più di 300 secondi. Per questo ho usato timeout == 300 come dato di seguito, questo uccide il processo di ricerca ma esso uccide il generazione di processi figlio per codice muggito.Processo di kill automatico e processo figlio del pool di multiprocessing

ho cercato di trovare modo multiplo, ma senza successo:/

come posso uccidere processo padre da piscina insieme al suo processo figlio?

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

Albero Process 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 

sopra frammento di codice dosnt uccidere il processo figlio

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

Tesi bambino processo di ricerca conservano, questi processo figlio anche avere ucciso.

Si prega di corporazione.

Grazie

risposta

7

sono in grado di risolvere il mio problema utilizzando il modulo psutil

soluzione trovata su post sotto:

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 non esiste più , il metodo è chiamato [children] (http://pythonhosted.org/psutil/#psu til.Process.children) – user37203

+0

Ho usato daemonize, quindi questo approccio era esattamente quello che stavo cercando. – crsuarezf