python - multiprocessing Pool的自动杀进程和子进程

标签 python process timeout multiprocessing

我正在使用多处理模块进行并行处理。 下面的代码片段在 X 位置搜索字符串文件名,并返回找到字符串的文件名。 但在某些情况下,搜索过程需要很长时间,所以我试图用超过 300 秒的时间来终止搜索过程。为此,我使用 timeout == 300 如下所示,这会终止搜索过程,但确实会杀死子进程由波纹管代码生成。

我试图找到多种方法但没有成功:/

我如何从 Pool 中杀死父进程及其子进程?

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

上面的代码片段不会杀死子进程

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

这些子搜索进程保留,这些子进程也被杀死。

请公会。

谢谢

最佳答案

我可以使用 psutil 模块解决我的问题

在下面的帖子中找到了解决方案:

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

关于python - multiprocessing Pool的自动杀进程和子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22784890/

相关文章:

python - 如何在 PyQt4 QTreeWidget 的列单元格内绘制烛台条

java - 用Java启动一个进程?

java - 使用 Runtime.getRuntime() 在 Java 中运行命令行

python - 如何将模型操作传递给 Tkinter MVC 中的查看按钮?

python - 如何将 dask.dataframe 预缓存到所有 worker 和分区以减少通信需求

python - 使用 MySQLdb 时如何使用 Python 列表理解(或类似的)来检索行?

c++ - fork创建子进程时,parent ID与parent ID不一样

angularjs - 使用 Protractor 测试临时元素的内容

c# - 在返回值的函数上实现超时

windows - 错误 1053 : the service did not respond to the start or control request in a timely fashion