Berurutan: for i in {1..1000}; do do_something $i; done
- terlalu lambat
Paralel: for i in {1..1000}; do do_something $i& done
- terlalu banyak memuat
Bagaimana menjalankan perintah secara paralel, tetapi tidak lebih dari, misalnya, 20 instance per momen?
Sekarang biasanya menggunakan hack like for i in {1..1000}; do do_something $i& sleep 5; done
, tetapi ini bukan solusi yang baik.
Pembaruan 2 : Mengonversi jawaban yang diterima menjadi skrip: 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
Perhatikan bahwa Anda harus mengganti 8 spasi dengan 2 tab sebelum "i =" untuk membuatnya berfungsi.
parallel
moreutils bukan GNU Paralel dan cukup terbatas dalam opsinya. Perintah di atas tidak akan berjalan dengan paralel dari moreutils.xargs --max-procs=20
.Bukan solusi bash, tetapi Anda harus menggunakan Makefile, mungkin dengan
-l
tidak melebihi beberapa beban maksimum.Kemudian untuk memulai 20 pekerjaan sekaligus lakukan
atau untuk memulai pekerjaan sebanyak mungkin tanpa melebihi beban 5
sumber
echo -e 'PHONY=jobs\njobs=$(shell echo {1..100000})\n\nall: ${jobs}\n\n${jobs}:\n\t\techo $@; sleep `echo $$RANDOM/6553 | bc -l`' | make -f - -j20
Sekarang terlihat lebih retas lagi.memposting skrip dalam pertanyaan dengan pemformatan:
Perhatikan bahwa Anda harus mengganti 8 spasi dengan 2 tab sebelum "i =".
sumber
Satu ide sederhana:
Periksa i modulo 20 dan jalankan perintah wait shell sebelum do_something.
sumber
Anda bisa menggunakan
ps
untuk menghitung berapa banyak proses yang telah Anda jalankan, dan setiap kali ini turun di bawah ambang tertentu Anda memulai proses lain.Kode palsu:
sumber
sumber
while [ `jobs | wc -l` -ge 20]; do
?njobs
dua kali, dan kinerja cukup penting dalam skrip shell yang menjalankan tugas tidur;)sleep 1
kesleep 0.1
dan mulai rata-rata njobs ke 40-50 bukannya 20. Jika ada lebih dari 20 pekerjaan kita perlu menunggu pekerjaan selesai, bukan hanya menunggu 1 detik.Anda bisa melakukannya seperti ini.
menggunakan pipa bernama, setiap kali, ia menjalankan 20 sub shell secara paralel.
Semoga bisa membantu :)
sumber