Shell

並行執行管道命令

  • July 8, 2021

考慮以下場景。我有兩個程序 A 和 B。程序 A 輸出到 stdout 字元串列,而程序 B 處理來自 stdin 的行。這兩個程序的使用方式當然是:

foo@bar:~$ A | 乙

現在我注意到這只佔用了一個核心;因此我想知道:

程序 A 和 B 是否共享相同的計算資源?如果是這樣,有沒有辦法同時執行 A 和 B?

我注意到的另一件事是 A 的執行速度比 B 快得多,因此我想知道是否可以以某種方式執行更多的 B 程序並讓它們並行處理 A 輸出的行。

也就是說,A 將輸出它的行,並且將有 N 個程序 B 實例讀取這些行(誰先讀取它們)處理它們並將它們輸出到標準輸出上。

所以我的最後一個問題是:

有沒有辦法在幾個 B 程序中將輸出通過管道傳輸到 A 而不必處理可能出現的競爭條件和其他不一致?

一個問題split --filter是輸出可能會混淆,所以你從程序 1 得到半行,然後從程序 2 得到半行。

GNU Parallel 保證不會有混淆。

所以假設你想做:

A | B | C

但是那個 B 非常慢,因此你想要並行化它。然後你可以這樣做:

A | parallel --pipe B | C

預設情況下,GNU Parallel 在 \n 上拆分,塊大小為 1 MB。這可以通過 –recend 和 –block 進行調整。

您可以在以下位置找到有關 GNU Parallel 的更多資訊:http ://www.gnu.org/s/parallel/

您可以在 10 秒內安裝 GNU Parallel:

$ (wget -O - pi.dk/3 || lynx -source pi.dk/3 || curl pi.dk/3/ || \
  fetch -o - http://pi.dk/3 ) > install.sh
$ sha1sum install.sh | grep 883c667e01eed62f975ad28b6d50e22a
12345678 883c667e 01eed62f 975ad28b 6d50e22a
$ md5sum install.sh | grep cc21b4c943fd03e93ae1ae49e28573c0
cc21b4c9 43fd03e9 3ae1ae49 e28573c0
$ sha512sum install.sh | grep da012ec113b49a54e705f86d51e784ebced224fdf
79945d9d 250b42a4 2067bb00 99da012e c113b49a 54e705f8 6d51e784 ebced224
fdff3f52 ca588d64 e75f6033 61bd543f d631f592 2f87ceb2 ab034149 6df84a35
$ bash install.sh

在http://www.youtube.com/playlist?list=PL284C9FF2488BC6D1上觀看介紹影片

引用自:https://unix.stackexchange.com/questions/79501