последовательный: for i in {1..1000}; do do_something $i; done
- слишком медленно
параллель: for i in {1..1000}; do do_something $i& done
- слишком большая нагрузка
как выполнять команды параллельно, но не более, например, 20 экземпляров в момент времени?
теперь обычно с помощью Хака, как for i in {1..1000}; do do_something $i& sleep 5; done
, но это не хорошее решение.
обновление 2:
Преобразован принято отвечать на скрипт: http://vi-server.org/vi/parallel
#!/bin/bash
NUM=; 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
обратите внимание, что необходимо заменить 8 пробелов на 2 вкладки перед " i=", чтобы заставить его работать.