我有一个二进制文件(比如说
这非常简单:我生成一个配置并将其传递给工作进程,工作进程使用 subprocess 调用带有该配置的二进制文件。我还将输出重定向到文件。我们称这段代码为
但是在我启动程序之后,我发现生成的进程数量未达预期。我明确提交了超过40个worker,但在top命令中,我只看到了大约20个a.out。我看到很多run.py处于“睡眠”状态(即在top命令中为“S”)。当我使用
我在想,这是为什么?我将输出重定向到网络挂载的硬盘上,这可能是一个原因,但在top命令中,我只看到10%wa(我理解为等待IO的时间占总时间的10%)。我认为这不会导致CPU闲置50%。此外,我应该至少可以生成二进制文件,而不是被困在
是否还有其他解释?或者我在python代码中有错吗?
a.out
),我想用不同的配置来调用它。我想在一个拥有40个核心的机器上并行运行这些配置。下面是我的代码草图。这非常简单:我生成一个配置并将其传递给工作进程,工作进程使用 subprocess 调用带有该配置的二进制文件。我还将输出重定向到文件。我们称这段代码为
run.py
。def worker(cmdlist, filename):
outputfile = open(filename, 'wb')
// here it essentially executes a.out config > outputfile
subprocess.call(cmdlist, stderr=outputfile, stdout=outputfile)
outputfile.close()
def main():
pool = Pool(processes = 40)
for config in all_configs
filename, cmdlist = genCmd(config)
res = pool.apply_async(worker, [cmdlist, filename])
results.append(res)
for res in results:
res.get()
pool.close()
但是在我启动程序之后,我发现生成的进程数量未达预期。我明确提交了超过40个worker,但在top命令中,我只看到了大约20个a.out。我看到很多run.py处于“睡眠”状态(即在top命令中为“S”)。当我使用
ps auf
命令时,我还看到许多处于“S+”状态的run.py,没有二进制文件被生成出来。只有一半左右生成了“a.out”。我在想,这是为什么?我将输出重定向到网络挂载的硬盘上,这可能是一个原因,但在top命令中,我只看到10%wa(我理解为等待IO的时间占总时间的10%)。我认为这不会导致CPU闲置50%。此外,我应该至少可以生成二进制文件,而不是被困在
run.py
中。我的二进制文件运行时间也足够长。我应该真的能看到40个作业长时间运行。是否还有其他解释?或者我在python代码中有错吗?
xargs -n 1 -P 40 a.out <parameters_file
的东西来保持40个a.out进程运行,每个进程都有一个参数,这些参数来自可能包含数千个参数的parameters_file。如果需要基于参数构建复杂的命令行,则可能需要用小脚本替换a.out。 - Brian Swift