GNU parallel vs & (maksud saya latar belakang) vs xargs -P

40

Saya bingung tentang perbedaan atau keuntungan (jika ada) menjalankan serangkaian tugas dalam .shskrip menggunakanGNU parallel

Misalnya jawaban Ole Tange :

parallel ./pngout -s0 {} R{} ::: *.png

daripada mengatakan perulangan melalui mereka menempatkan mereka di latar belakang &.

Misalnya jawaban frostschutz :

#copied from the link for illustration
for stuff in things
do
( something
  with
  stuff ) &
done
wait # for all the something with stuff

Singkatnya, apakah mereka secara sintaktis atau praktis berbeda? Dan jika praktis berbeda kapan saya harus menggunakan masing-masing?

Stephen Henderson
sumber

Jawaban:

46

Menempatkan banyak pekerjaan di latar belakang adalah cara yang baik untuk menggunakan banyak inti dari satu mesin. parallelnamun, memungkinkan Anda untuk menyebarkan pekerjaan di beberapa server jaringan Anda. Dari man parallel:

GNU parallel adalah alat shell untuk mengeksekusi pekerjaan secara paralel menggunakan satu atau lebih komputer . Input khas adalah daftar file, daftar host , daftar pengguna, daftar URL, atau daftar tabel.

Bahkan ketika berjalan di satu komputer, parallelmemberi Anda kontrol yang jauh lebih besar tentang bagaimana pekerjaan Anda diparalelkan. Ambil contoh ini dari manhalaman:

   To convert *.wav to *.mp3 using LAME running one process per CPU core
   run:

   parallel lame {} -o {.}.mp3 ::: *.wav

OK, Anda bisa melakukan hal yang sama dengannya

   for i in *wav; do lame "$i" -o "${i%.wav}.mp3" & done

Namun, itu lebih lama dan lebih rumit dan, yang lebih penting, akan meluncurkan banyak pekerjaan karena ada .wavfile. Jika Anda menjalankan ini pada beberapa ribu file, kemungkinan akan membuat laptop normal bertekuk lutut. paralleldi sisi lain, akan meluncurkan satu pekerjaan per inti CPU dan menjaga semuanya tetap bagus dan rapi.

Pada dasarnya, parallelmenawarkan Anda kemampuan untuk menyempurnakan bagaimana pekerjaan Anda dijalankan dan berapa banyak sumber daya yang tersedia yang harus mereka gunakan. Jika Anda benar-benar ingin melihat kekuatan alat ini, bacalah manualnya atau, paling tidak, contoh-contoh yang ditawarkannya.

Latar belakang sederhana benar-benar tidak memiliki tingkat kecanggihan untuk dibandingkan dengan paralel. Adapun parallelperbedaannya xargs, kerumunan GNU memberikan rincian yang bagus di sini . Beberapa poin yang lebih menonjol adalah:

  • xargs berurusan dengan buruk dengan karakter khusus (seperti spasi, 'dan ").
  • xargs dapat menjalankan sejumlah pekerjaan secara paralel, tetapi tidak memiliki dukungan untuk menjalankan sejumlah pekerjaan cpu-core secara paralel.
  • xargs tidak memiliki dukungan untuk pengelompokan output, oleh karena itu output dapat berjalan bersama, misalnya paruh pertama garis adalah dari satu proses dan bagian terakhir dari garis adalah dari proses lain.
  • xargs tidak memiliki dukungan untuk menjaga urutan output, oleh karena itu jika menjalankan pekerjaan secara paralel menggunakan xargs, output dari pekerjaan kedua tidak dapat ditunda sampai pekerjaan pertama selesai.
  • xargs tidak memiliki dukungan untuk menjalankan pekerjaan di komputer jarak jauh.
  • xargs tidak memiliki dukungan untuk penggantian konteks, jadi Anda harus membuat argumen.
terdon
sumber
1
Itu jawaban yang bagus, thx. Ini semacam mengkonfirmasi apa yang saya duga. Saya benci parallelsintaksisnya, satu lagi merek baru keyboard-faceroll untuk dihafal. Tapi saya kira auto balancing lintas core / pekerjaan sepadan ...?
Stephen Henderson
3
Lihatlah semyang merupakan bagian dari paket Paralel GNU. Itu mungkin lebih cocok dengan persyaratan sintaks Anda.
Ole Tange
1
@OtTange thx, panggilan yang bagus
Stephen Henderson
> xargs tidak memiliki dukungan untuk penggantian konteks, jadi Anda harus membuat argumen. --- Apa artinya ini? Bukankah itu xargs -I%
hujan
4
Memang benar itu parallellebih kuat daripada xargs, tetapi perbandingan itu agak bias. Sebagai contoh, xargsmendukung string yang diakhiri dengan null sebagai input untuk menghindari masalah dengan spasi dan kutipan, dan dapat juga -duntuk ditiru parallel(bahkan disebutkan dalam perbandingan!). xargs -Iadalah penggantian konteks yang cukup untuk sebagian besar kasus sederhana, dan saya biasanya tahu jumlah core pada mesin. Saya tidak pernah mengalami masalah dengan output yang tidak dikelompokkan.
Sam Brightman