2014-04-01 26 views
8

Paralel işlem için çok işlemcili bir modül kullanıyorum. Körük kod snippet'i, dize dosya adını X konumunda arayın ve dizenin bulunduğu dosya adını döndürün. Ancak bazı durumlarda arama işlemi için çok uzun zaman alır, bu yüzden arama işlemini 300 saniyeden fazla sürdürebilirim. Zaman aşımı için kullanılan zaman aşımı = 300 olarak kullanılır, bu arama sürecini öldürür fakat Çocuk işlemi feryat koduyla ortaya çıkar./Otomatik işlem süreci ve çok işlemcili çocuk işlemleri Havuz

Nasıl alt işlemleri ile birlikte havuzundan ana işlem öldürebilir:

Birden yol ama hiçbir başarı bulmaya çalıştılar? Process Explorer

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

Süreç Ağacı: kod parçacığı üzerinde

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 

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

Tezler çocuk arama süreci korumak çocuk sürecini öldürmek dosnt, bu çocuk süreci de öldürülür.

Lütfen lonca.

Teşekkür

cevap

7

Ben psutil modülünü kullanarak Sorunu çözebilecek duyuyorum

feryat yayında

Bulunan çözüm:

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 artık yok , yöntem [çocuklar] denir (http://pythonhosted.org/psutil/#psu til.Process.children) – user37203

+0

Ben, daemonize kullandım, bu yüzden bu yaklaşım tam olarak aradığım şeydi. – crsuarezf