GNU song song vs & (ý tôi là nền) so với xargs -P


39

Tôi bối rối về sự khác biệt hoặc lợi thế (nếu có) của việc chạy một nhóm tác vụ trong .shtập lệnh bằng cách sử dụngGNU parallel

Ví dụ : câu trả lời của Ole Tange :

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

thay vì nói lặp qua chúng đặt chúng vào nền &.

Ví dụ: câu trả lời của frostschutz :

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

Nói tóm lại, chúng chỉ khác về mặt cú pháp hay thực tế? Và nếu thực tế khác nhau khi nào tôi nên sử dụng mỗi?

Câu trả lời:


46

Đặt nhiều công việc trong nền là một cách tốt để sử dụng nhiều lõi của một máy. paralleltuy nhiên, cho phép bạn truyền bá công việc trên nhiều máy chủ của mạng. Từ man parallel:

GNU song song là một công cụ shell để thực hiện các công việc song song bằng cách sử dụng một hoặc nhiều máy tính . Đầu vào điển hình là danh sách các tệp, danh sách máy chủ lưu trữ , danh sách người dùng, danh sách URL hoặc danh sách bảng.

Ngay cả khi chạy trên một máy tính, nó parallelmang lại cho bạn quyền kiểm soát lớn hơn nhiều so với cách các công việc của bạn được song song hóa. Lấy ví dụ này từ mantrang:

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

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

OK, bạn có thể làm tương tự với

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

Tuy nhiên, điều đó dài hơn và cồng kềnh hơn và quan trọng hơn là sẽ khởi chạy nhiều công việc như có .wavtệp. Nếu bạn chạy nó trên một vài nghìn tệp, nó có khả năng mang một máy tính xách tay bình thường đến đầu gối của nó. parallelmặt khác, sẽ khởi chạy một công việc trên mỗi lõi CPU và giữ mọi thứ tốt đẹp và gọn gàng.

Về cơ bản, parallelcung cấp cho bạn khả năng tinh chỉnh cách thức công việc của bạn được chạy và bao nhiêu tài nguyên có sẵn mà họ nên sử dụng. Nếu bạn thực sự muốn thấy sức mạnh của công cụ này, hãy xem qua hướng dẫn của nó hoặc, ít nhất, các ví dụ mà nó cung cấp.

Nền đơn giản thực sự không có nơi nào gần mức độ tinh tế để so sánh với song song. Đối với sự parallelkhác biệt như thế nào xargs, đám đông GNU đưa ra một sự cố tốt đẹp ở đây . Một số điểm nổi bật hơn là:

  • xargs xử lý không tốt các ký tự đặc biệt (như dấu cách, 'và ").
  • xargs có thể chạy song song một số lượng công việc nhất định, nhưng không hỗ trợ để chạy song song các công việc số lõi.
  • xargs không hỗ trợ để nhóm đầu ra, do đó đầu ra có thể chạy cùng nhau, ví dụ nửa đầu của một dòng là từ một quy trình và nửa cuối của dòng là từ một quy trình khác.
  • xargs không hỗ trợ cho việc giữ thứ tự đầu ra, do đó, nếu chạy các công việc song song bằng cách sử dụng xargs, đầu ra của công việc thứ hai không thể bị hoãn cho đến khi công việc đầu tiên được thực hiện.
  • xargs không hỗ trợ để chạy các công việc trên máy tính từ xa.
  • xargs không hỗ trợ thay thế ngữ cảnh, vì vậy bạn sẽ phải tạo các đối số.

1
Đó là một câu trả lời tốt, thx. Nó loại xác nhận những gì tôi đoán. Tôi ghét parallelcú pháp, nhưng một thương hiệu mới khác của bàn phím-faceroll để ghi nhớ. Nhưng tôi đoán việc tự động cân bằng giữa các lõi / công việc có đáng không ...?
Stephen Henderson

3
Hãy xem semđó là một phần của gói GNU Parallel. Điều đó có thể phù hợp với yêu cầu cú pháp của bạn tốt hơn.
Ole Tange

1
@OleTange thx, cuộc gọi tốt
Stephen Henderson

> xargs không hỗ trợ thay thế ngữ cảnh, vì vậy bạn sẽ phải tạo các đối số. --- Điều đó có nghĩa là gì? Không phải là xargs -I%
raine

4
Đúng parallellà nó mạnh hơn xargs, nhưng sự so sánh đó khá thiên vị. Ví dụ: xargshỗ trợ các chuỗi kết thúc null làm đầu vào để tránh các vấn đề với khoảng trắng và dấu ngoặc kép và cũng có thể -dmô phỏng parallel(thậm chí được đề cập trong phần so sánh!). xargs -Ilà sự thay thế bối cảnh đủ cho hầu hết các trường hợp đơn giản và tôi thường biết số lượng lõi trên máy. Tôi chưa bao giờ gặp vấn đề với đầu ra không được nhóm.
Sam Brightman
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.