并行运行命令并限制同时执行的命令数

Vi.*_*Vi. 25 linux bash parallel-processing

顺序:for i in {1..1000}; do do_something $i; done- 太慢

并行:for i in {1..1000}; do do_something $i& done- 负载过多

如何并行运行命令,但不超过例如每时 20 个实例?

现在通常使用 hack like for i in {1..1000}; do do_something $i& sleep 5; done,但这不是一个好的解决方案。

更新 2:将接受的答案转换为脚本:http : //vi-server.org/vi/parallel

#!/bin/bash

NUM=$1; shift

if [ -z "$NUM" ]; then
    echo "Usage: parallel <number_of_tasks> command"
    echo "    Sets environment variable i from 1 to number_of_tasks"
    echo "    Defaults to 20 processes at a time, use like \"MAKEOPTS='-j5' parallel ...\" to override."
    echo "Example: parallel 100 'echo \$i; sleep \`echo \$RANDOM/6553 | bc -l\`'"
    exit 1
fi

export CMD="$@";

true ${MAKEOPTS:="-j20"}

cat << EOF | make -f - -s $MAKEOPTS
PHONY=jobs
jobs=\$(shell echo {1..$NUM})

all: \${jobs}

\${jobs}:
        i=\$@ sh -c "\$\$CMD"
EOF
Run Code Online (Sandbox Code Playgroud)

请注意,您必须在“i=”之前用 2 个制表符替换 8 个空格才能使其工作。

小智 16

GNU Parallel就是为此而生的。

seq 1 1000 | parallel -j20 do_something
Run Code Online (Sandbox Code Playgroud)

它甚至可以在远程计算机上运行作业。下面是一个使用 server2 和每个 CPU 内核运行 1 个作业的本地计算机将 MP3 重新编码为 OGG 的示例:

parallel --trc {.}.ogg -j+0 -S server2,: \
     'mpg321 -w - {} | oggenc -q0 - -o {.}.ogg' ::: *.mp3
Run Code Online (Sandbox Code Playgroud)

在此处观看 GNU Parallel 的介绍视频:

http://www.youtube.com/watch?v=OpaiGYxkSuQ

  • 还有一个选项:`xargs --max-procs=20`。 (2认同)