ฉันจะใช้ GNU Parallel ในขณะนี้ได้อย่างไร


คำตอบ:


13

คุณไม่ได้ใช้การวนรอบสักครู่

parallel "sortstuff.sh -a {} > sortedstuff-{}" <live_hosts

โปรดทราบว่าสิ่งนี้จะไม่ทำงานหากคุณมีเส้นทางในlive_hosts(เช่น/some/dir/file) ตามที่จะขยายเป็นsortstuff.sh -a /some/dir/file > sortedstuff-/some/dir/file(ทำให้เกิดno such file or directory); สำหรับกรณีเหล่านั้นใช้{//}และ{/}(ดูgnu-parallelคู่มือสำหรับรายละเอียด):

parallel "sortstuff.sh -a {} > {//}/sortedstuff-{/}" <live_hosts

มันเป็นไปได้ที่จะใช้teeกับparallelเมื่อใส่เอาท์พุทเข้าsortedstuff? ดังนั้นฉันสามารถดูผลลัพธ์ได้
ชนชั้นกรรมาชีพ

1
@Proletariat - คุณต้องการส่งออกไปยัง terminal ด้วยหรือไม่ เพียงแค่แทนที่>ด้วย| teeเช่นคำสั่งแรกจะกลายเป็น parallel "sortstuff.sh -a {} | tee sortedstuff-{}" <live_hosts
don_crissti

3

ในฐานะที่เป็นโรงเรียนเก่า "ทำสิ่งหนึ่งและทำมันให้ดี" คนที่แต่งตัวประหลาด Unix ฉันจะใส่สิ่งที่ใช้แทนสตริงลงในสคริปต์ตัวคลุม:

#!/bin/sh
sortstuff.sh -a "$1" > sortedstuff-"$1"

ถ้าคุณเรียกมันว่าwrapper.shที่parallelคำสั่งจะเรียกมันว่าจะเป็น:

parallel wrapper.sh < live_hosts

โปรดทราบว่าคุณไม่จำเป็นต้องcatใช้สิ่งนี้ซึ่งบันทึกการเรียกใช้โปรแกรมภายนอก


2

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

while read host; do
    sortstuff.sh -a "$host" > sortedstuff-"$host" &
done < live_hosts
wait    # Optional, to block until the background tasks are done

parallelทำให้การจัดการด้านบางอย่างง่ายขึ้น คุณสามารถ จำกัด จำนวนของงานที่ทำงานแบบขนานได้ง่ายขึ้น


3
ถ้าwc -l live_hostsมีมากกว่าจำนวนแกนดิสก์หรือแกนประมวลผล CPU - ขึ้นอยู่กับว่างานคือ I / O หรือ CPU-bound คุณจะกินข้อได้เปรียบมากมายที่คุณได้รับจากการขนานกันด้วยวิธีแก้ปัญหาเช่นนั้น ความสามารถในparallelการ จำกัด จำนวนของงานไม่ได้เป็นเพียงเรื่องดีมันเป็นเรื่องสำคัญหากความเร็วในการประมวลผลเป็นเป้าหมายของคุณ
Warren Young
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.