Làm cách nào để sử dụng GNU Parallel cho vòng lặp while này?


12

Vì vậy, tôi có một vòng lặp while:

cat live_hosts | while read host; do \
    sortstuff.sh -a "$host" > sortedstuff-"$host"; done

Nhưng điều này có thể mất một thời gian dài. Làm cách nào để sử dụng GNU Parallel cho vòng lặp while này?

Câu trả lời:


13

Bạn không sử dụng vòng lặp while.

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

Lưu ý rằng điều này sẽ không hoạt động nếu bạn có đường dẫn trong live_hosts(ví dụ /some/dir/file) vì nó sẽ mở rộng sang sortstuff.sh -a /some/dir/file > sortedstuff-/some/dir/file(kết quả là no such file or directory); đối với những trường hợp sử dụng {//}{/}(xem gnu-parallelhướng dẫn để biết chi tiết):

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

Có thể sử dụng teevới parallelkhi đưa đầu ra vào sortedstuff? Vì vậy, tôi có thể thấy đầu ra khi nó đi.
Vô sản

1
@Proletariat - bạn cũng muốn xuất ra thiết bị đầu cuối? Chỉ cần thay thế >bằng | teeví dụ lệnh đầu tiên trở thành parallel "sortstuff.sh -a {} | tee sortedstuff-{}" <live_hosts
don_crissti

3

Là một người cũ "làm một việc và làm tốt" anh chàng Unix, tôi đã đặt công cụ thay thế chuỗi vào tập lệnh bao bọc:

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

Nếu bạn gọi nó wrapper.sh, parallellệnh để gọi nó sẽ là:

parallel wrapper.sh < live_hosts

Lưu ý rằng bạn không cần catloại điều này, giúp lưu một lệnh gọi chương trình bên ngoài.


2

Bạn không cần parallel , vì phần thân của vòng lặp không phụ thuộc vào các lần lặp trước. Chỉ cần bắt đầu một quá trình nền mới cho mỗi máy chủ.

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

parallelmặc dù làm cho nó dễ dàng hơn để quản lý các khía cạnh nhất định; bạn có thể giới hạn số lượng công việc chạy song song dễ dàng hơn.


3
Nếu wc -l live_hostsnhiều hơn số lượng trục chính hoặc lõi CPU - tùy thuộc vào nhiệm vụ là I / O hay bị ràng buộc bởi CPU - bạn sẽ ăn được rất nhiều lợi thế bạn có được từ việc xử lý song song với giải pháp như vậy. Khả năng parallelgiới hạn số lượng công việc không chỉ là tốt, nó gần như là điều cần thiết, nếu tốc độ xử lý là mục tiêu của bạn.
Warren Young
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.