在Python(3.5)中,我开始通过Xshell连接中的multiprocessing.Pool.map + subprocess运行外部可执行文件(用C ++编写)。但是,由于互联网状况不佳,Xshell连接中断。
再次连接后,我看到管理Python已经消失,但C ++可执行文件仍然在运行(并且它看起来像是以正确的方式,池似乎仍然可以控制它们。)
问题是这是否是一个错误,以及在这种情况下我将做什么。我不能kill
或kill -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)
答案 0 :(得分:2)
multiprocessing.Pool
确实会在terminate()
上终止其工作人员,__del__
也会调用subprocess.check_call
,而Popen
也会在模块卸载时调用(退出时)。
这些家伙成为孤儿的原因是因为else
产生了退出时没有被终止。
这个事实在参考文献中没有明确提及,但没有任何迹象表明产生的终止。对source code的简要回顾也没有给我发现任何结论。这种行为也很容易测试。
要清除父级终止,请使用0
界面和此回答Killing child process when parent crashes in python