shell 批处理中N个进程并行运行bash命令

xiozqbni  于 2023-03-13  发布在  Shell
关注(0)|答案(4)|浏览(174)

我有命令:

python test.py -i input_file -p parameter_1 -o output_file

我想为多个输入文件运行这个,一次4个输入文件(并行),一旦它们完成运行下4个,等等,使用一个bash脚本。
我找不到正确的答案。
我正在尝试以下操作,但不确定是否正确

for (( n=0; n<12; n++ ))
do
    ((j=j%4)); ((j++==0)) && wait
    python test.py -i input_list[n] -p parameter_1 -o output_$n &
done

先谢了!

zpqajqem

zpqajqem1#

在bash脚本中,您可以尝试以下操作:

processes_max=4
counter=0

for f in input_files/*.txt
do
    python test.py -i $f -p parameter_1 -o output_files/$(basename $f) &  
    counter=$((counter+1))
    # if the counter equal to processes_max: wait for all processes to finish
    if [ $counter -eq $processes_max ]; then
        wait
        counter=0
    fi
done

wait
amrnrhlw

amrnrhlw2#

创建作业后需要等待。

for (( n = 0; n < 12; ++n )); do
    python test.py -i 'input_list[n]' -p parameter_1 -o "output_$n" &
    (( j = (j + 1) % 4 )) || wait
done

可以选择在循环后添加另一个wait,以等待少于4个进程。

htrmnn0y

htrmnn0y3#

如果您有GNU Parallel:

parallel -j4 python test.py -i {} -p parameter_1 -o {}.output ::: inputfiles*

如果您的系统有4个CPU线程,则可以删除-j4
它将启动4个作业,当一个作业完成时,它将启动下一个作业。
与等待所有4个作业完成相比,这可以提供更好的CPU利用率-特别是在其中一个作业比其他作业花费更长时间的情况下。

vaqhlq81

vaqhlq814#

如果你只是想一次运行最多4个作业,GNU parallel将是你的理想选择:

printf '%s\n' "${input_list[@]}" |
  parallel -j4 'python test.py -i {} -p parameter_1 -o output_$(({#}-1))'

但是,如果您希望等到4个作业完成后再开始下一批处理(效率较低),可以将4个作业分组到一个bash函数中,然后对-j1 -N4使用parallel:

foo() {
  ((n=4*("$1"-1))); shift
  for ((i=0;i<4;i++)); do
    python test.py -i "$1" -p parameter_1 -o output_"$((n+i))" & shift
  done
  wait
}
export -f foo
printf '%s\n' "${input_list[@]}" | parallel -j1 -N4 foo {#} {1} {2} {3} {4}

相关问题