GNU parallel vs & (ฉันหมายถึงพื้นหลัง) vs xargs -P


39

ฉันสับสนเกี่ยวกับความแตกต่างหรือข้อได้เปรียบ (ถ้ามี) ของการใช้งานชุดหนึ่งใน.shสคริปต์โดยใช้GNU parallel

คำตอบของEg Ole Tange :

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

&แทนที่จะพูดบ่วงผ่านพวกเขาวางไว้ในพื้นหลัง

คำตอบของFrostschutzเช่น:

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

ในระยะสั้นพวกเขามีเพียง syntactically หรือจริงแตกต่างกันอย่างไร และถ้าแตกต่างกันจริงเมื่อฉันควรใช้แต่ละ

คำตอบ:


46

การวางหลายงานในพื้นหลังเป็นวิธีที่ดีในการใช้หลายคอร์ของเครื่องเดียว parallelอย่างไรก็ตามอนุญาตให้คุณกระจายงานผ่านเซิร์ฟเวอร์หลายเครื่องในเครือข่ายของคุณ จากman parallel:

GNU Parallel เป็นเครื่องมือเชลล์สำหรับการเรียกใช้งานแบบขนานโดยใช้คอมพิวเตอร์ตั้งแต่หนึ่ง เครื่องขึ้นไป อินพุตทั่วไปคือรายการไฟล์รายการโฮสต์รายการผู้ใช้รายการ URL หรือรายการตาราง

แม้ขณะทำงานบนคอมพิวเตอร์เครื่องเดียวก็parallelช่วยให้คุณสามารถควบคุมวิธีการทำงานแบบขนานได้มากขึ้น นำตัวอย่างนี้จากmanหน้า:

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

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

ตกลงคุณสามารถทำเช่นเดียวกันกับ

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

อย่างไรก็ตามนั่นจะนานและยุ่งยากมากขึ้นและที่สำคัญกว่านั้นจะเปิดใช้งานมากเท่าที่มี.wavไฟล์ หากคุณรันไฟล์นี้สองสามพันไฟล์มีแนวโน้มที่จะนำแล็ปท็อปทั่วไปมาที่หัวเข่าของมัน parallelในทางตรงกันข้ามจะเปิดตัวหนึ่งงานต่อซีพียูคอร์และทำให้ทุกอย่างดีและเป็นระเบียบ

โดยทั่วไปparallelจะให้ความสามารถในการปรับแต่งการทำงานของคุณและทรัพยากรที่มีอยู่ที่ควรใช้ หากคุณต้องการเห็นพลังของเครื่องมือนี้จริงๆให้อ่านคู่มือหรืออย่างน้อยตัวอย่างที่มีให้

พื้นหลังที่เรียบง่ายจริงๆไม่มีที่ใดที่ใกล้เคียงกับระดับความซับซ้อนที่จะเปรียบเทียบกับแบบขนาน สำหรับวิธีการparallelที่แตกต่างจากxargsที่ GNU ฝูงชนให้รายละเอียดที่ดีที่นี่ บางจุดที่เด่นชัดมากขึ้นคือ:

  • xargs จัดการกับอักขระพิเศษไม่ดี (เช่น space, 'และ ")
  • xargs สามารถรันจำนวนงานที่กำหนดในแบบขนาน แต่ไม่มีการสนับสนุนสำหรับการรันงาน number-of-cpu-cores แบบขนาน
  • xargs ไม่สนับสนุนการจัดกลุ่มเอาต์พุตดังนั้นเอาต์พุตอาจทำงานร่วมกันเช่นครึ่งแรกของบรรทัดมาจากกระบวนการหนึ่งและครึ่งสุดท้ายของบรรทัดมาจากกระบวนการอื่น
  • xargs ไม่สนับสนุนการรักษาลำดับของผลลัพธ์ดังนั้นหากการรันงานแบบขนานโดยใช้ xargs ผลลัพธ์ของงานที่สองไม่สามารถเลื่อนออกไปจนกว่างานแรกจะเสร็จสิ้น
  • xargs ไม่รองรับการเรียกใช้งานบนคอมพิวเตอร์ระยะไกล
  • xargs ไม่รองรับการแทนที่บริบทดังนั้นคุณจะต้องสร้างอาร์กิวเมนต์

1
นั่นเป็นคำตอบที่ดีขอบคุณ มันเป็นการยืนยันสิ่งที่ฉันเดา ฉันเกลียดparallelไวยากรณ์ แต่แบรนด์ใหม่ของ faceroll แป้นพิมพ์ที่จะจดจำ แต่ฉันเดาว่าการทำให้สมดุลอัตโนมัติระหว่างคอร์ / งานนั้นคุ้มค่า ...
Stephen Henderson

3
ดูที่semส่วนหนึ่งของแพ็คเกจ GNU Parallel ซึ่งอาจเหมาะกับความต้องการด้านไวยากรณ์ของคุณดีกว่า
Ole Tange

1
@OleTange ขอบคุณโทรดี
Stephen Henderson

> xargs ไม่รองรับการแทนที่บริบทดังนั้นคุณจะต้องสร้างอาร์กิวเมนต์ --- สิ่งนี้หมายความว่า? ไม่ใช่ xargs -I%
เรน

4
มันเป็นความจริงที่parallelมีพลังมากกว่าxargsแต่การเปรียบเทียบนั้นค่อนข้างลำเอียง ตัวอย่างเช่นxargsสนับสนุนสตริงที่สิ้นสุดด้วย null เป็นอินพุตเพื่อหลีกเลี่ยงปัญหาเกี่ยวกับช่องว่างและเครื่องหมายคำพูดและยังสามารถ-dเลียนแบบparallel(แม้จะกล่าวถึงในการเปรียบเทียบ!) xargs -Iเพียงพอสำหรับการแทนที่บริบทสำหรับกรณีที่ง่ายที่สุดและฉันมักจะรู้จำนวนแกนในเครื่อง ฉันไม่เคยประสบปัญหากับผลลัพธ์ที่ไม่ได้จัดกลุ่ม
Sam Brightman
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.