多处理Python关闭时,外部程序正在运行

时间:2016-04-10 16:13:41

标签: python subprocess multiprocessing

在Python(3.5)中,我开始通过Xshell连接中的multiprocessing.Pool.map + subprocess运行外部可执行文件(用C ++编写)。但是,由于互联网状况不佳,Xshell连接中断。

再次连接后,我看到管理Python已经消失,但C ++可执行文件仍然在运行(并且它看起来像是以正确的方式,池似乎仍然可以控制它们。)

问题是这是否是一个错误,以及在这种情况下我将做什么。我不能killkill -9他们。

添加:手动删除所有sublst_file后,所有正在运行的可执行文件(cmd)都消失了。似乎except sub.SubprocessError as e:部分仍然有效。

我的计划的基本框架概述如下。

import subprocess as sub
import multiprocessing as mp
import itertools as it
import os
import time

def chunks(lst, chunksize=5):
    return it.zip_longest(*[iter(lst)]*chunksize)

class Work():
    def __init__(self, lst):
        self.lst = lst

    def _work(self, sublst):
       retry_times = 6
       for i in range(retry_times):
             try:
                 cmd = 'my external c++ cmd'
                 sublst_file = 'a config file generated from sublst'
                 sub.check_call([cmd, sublst_file])
                 os.remove(sublst_file)
                 return sublst # return success sublst
             except sub.SubprocessError as e:
                 if i == (retry_times-1):
                    print('\n[ERROR] %s %s failed after %d tries\n' % (cmd, sublst_file, retry_times))
                    return []
                 else:
                     print('\n[WARNNING] %dth sleeping, please waiting for restart\n' % (i+1))
                     time.sleep(1+i)

    def work(self):
        with mp.Pool(4) as pool:
            results = pool.map(self._work, chunks(self.lst, 5))
        for r in it.chain(results):
            # other work on success items
            print(r)

1 个答案:

答案 0 :(得分:2)

multiprocessing.Pool确实会在terminate()上终止其工作人员,__del__也会调用subprocess.check_call,而Popen也会在模块卸载时调用(退出时)。

这些家伙成为孤儿的原因是因为else产生了退出时没有被终止。

这个事实在参考文献中没有明确提及,但没有任何迹象表明产生的终止。对source code的简要回顾也没有给我发现任何结论。这种行为也很容易测试。

要清除父级终止,请使用0界面和此回答Killing child process when parent crashes in python