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 的介绍视频:
| 归档时间: |
|
| 查看次数: |
24484 次 |
| 最近记录: |