gpt4 book ai didi

python - 当多处理 Python 关闭时外部程序正在运行

转载 作者:行者123 更新时间:2023-12-01 04:00:56 25 4
gpt4 key购买 nike

在 Python (3.5) 中,我开始通过 multiprocessing.Pool.map + subprocess 从 Xshell 连接运行外部可执行文件(用 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)

最佳答案

multiprocessing.Pool 确实会在 terminate() 上终止其工作线程,这也由 __del__ 调用,而 __del__ 又会在模块上调用卸载(在导出处)。

这些家伙之所以成为孤儿,是因为 subprocess.check_call 生成在退出时不会终止。

引用文献中没有明确提及这一事实,但没有任何迹象表明生成已终止。简单回顾source code也没有给我留下任何发现。这种行为也很容易测试。

要在父终止时进行清理,请使用 Popen 接口(interface)和此答案 Killing child process when parent crashes in python

关于python - 当多处理 Python 关闭时外部程序正在运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36532199/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com