Tuần tự: for i in {1..1000}; do do_something $i; done
- quá chậm
Song song: for i in {1..1000}; do do_something $i& done
- tải quá nhiều
Làm thế nào để chạy các lệnh song song, nhưng không nhiều hơn, ví dụ, 20 trường hợp mỗi khoảnh khắc?
Bây giờ thường sử dụng hack like for i in {1..1000}; do do_something $i& sleep 5; done
, nhưng đây không phải là một giải pháp tốt.
Cập nhật 2 : Chuyển đổi câu trả lời được chấp nhận thành tập lệnh: http://vi-server.org/vi/abul
#!/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
Lưu ý rằng bạn phải thay thế 8 khoảng trắng bằng 2 tab trước "i =" để làm cho nó hoạt động.