Apakah ini cara yang benar untuk memulai beberapa proses berurutan di latar belakang?
for i in {1..10}; do
for j in {1..10}; do
run_command $i $j;
done &
done;
Semua j
harus diproses setelah satu sama lain untuk diberikan i
, tetapi semua i
harus diproses secara bersamaan.
bash
background-process
for
parallelism
Radio Terkendali
sumber
sumber
Jawaban:
Lingkaran luar yang Anda miliki pada dasarnya
Ini akan memulai sepuluh contoh bersamaan
some_compound_command
di latar belakang. Mereka akan dimulai secepat mungkin, tetapi tidak cukup "semuanya pada saat yang sama" (yaitu jikasome_compound_command
membutuhkan waktu sangat sedikit, maka yang pertama mungkin selesai sebelum yang terakhir dimulai).Fakta yang
some_compound_command
terjadi sebagai sebuah loop tidak penting. Ini berarti bahwa kode yang Anda tunjukkan adalah benar bahwa iterasi darij
-loop akan berjalan secara berurutan, tetapi semua instance dari loop dalam (satu per iterasi dari loop-luari
) akan dimulai secara bersamaan.Satu-satunya hal yang perlu diingat adalah bahwa setiap pekerjaan latar belakang akan berjalan dalam subkulit. Ini berarti bahwa perubahan yang dibuat ke lingkungan (mis. Modifikasi nilai-nilai variabel shell, perubahan direktori kerja saat ini
cd
, dll.) Dalam satu contoh loop dalam tidak akan terlihat di luar pekerjaan latar belakang tertentu.Apa yang mungkin ingin Anda tambahkan adalah
wait
pernyataan setelah loop Anda, hanya untuk menunggu semua pekerjaan latar belakang benar-benar selesai, setidaknya sebelum skrip berakhir:sumber
Jika Anda memiliki GNU Paralel yang akan Anda lakukan:
Salah satu manfaatnya adalah bahwa output dari menjalankan paralel
run_commands
tidak akan bercampur.sumber