我试图将这个for循环并行。我无法弄清楚其他人的答案如何替换$a
值,因为我的程序依赖于它。
这是我要并行化的原始代码。 cvp是一个可执行的Cpp程序。此脚本的目的是使用file_0到file_29从0到29循环,pc_0到pc_29,0到29作为参数,并生成从output_0到output_29的输出文件。请注意,该程序也是内存密集型,所以如果我可以只是并行4(这是我拥有的核心数量)那将是伟大的。
#!/bin/bash
#testing script
for a in {0..29}
do
set -x
./cvp -v -w 256 -F 16,0,0,0,0 -f 5 file_$a.gz >>output_$a pc_$a $a
done
像这样的东西:
parallel --results output_{} ./cvp -v -w 256 -F 16,0,0,0,0 -f 5 file_{}.gz pc_{} {} ::: {0..29}
要么:
parallel ./cvp -v -w 256 -F 16,0,0,0,0 -f 5 file_{}.gz pc_{} {} ">>" output_{} ::: {0..29}
用bash简单腭化
您可以创建一个函数并将变量$a
作为第一个参数传递并在后台&
中运行,或者您可以在命令结尾处放置一个&
for for循环,我更喜欢函数。
函数使用第一个参数$1
并在每次调用时执行您喜欢的操作。
wait
将等待所有后台进程完成,否则脚本可以在后台进程之前完成。
#!/bin/bash
#testing script
myfunction () {
./cvp -v -w 256 -F 16,0,0,0,0 -f 5 file_${1}.gz >>output_${1} pc_${1} ${1}
}
for a in {0..29}
do
set -x
myfunction ${a} &
done
wait
如果你想使用gnu-parallel,我相信有人也会提供帮助。这样可以更好地控制腭化,就像只运行许多cpu核心那样的工作。我上面的例子没有检查这些东西只是启动它们。
因此,如果您想立即启动大量流程,那么我的示例就不是一个好的解决方案。