Shell
並行執行管道命令
考慮以下場景。我有兩個程序 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上觀看介紹影片