Shell

GNU Parallel:立即按作業順序一次顯示作業 stderr/stdout

  • April 21, 2016

我知道 GNU Parallel 緩衝 std/stderr 因為它不希望作業輸出被破壞,但是如果我使用 執行我的作業parallel do_something ::: task_1 task_2 task_3,無論如何都會立即顯示 task_1 的輸出,然後在 task_1 完成後,task_2 的目前輸出等

如果 Parallel 不能解決這個問題,還有其他類似的程序可以嗎?

從版本 20160422 開始,您可以執行以下操作:

parallel -k --lb do_something ::: task_1 task_2 task_3

parallel實際上對使輸出井井有條毫無保留。碰巧的是,作業通常足夠小,並且在 cpu 時間中平均分配以按順序出現。當您執行大量作業或它們的任務持續時間相差很大時,您會注意到它。

預設情況下parallel,只會執行與 CPU 核心數量相同的作業。在大多數筆記型電腦和台式機上,它是 2-4,這意味著它一次只能執行幾個作業。您可以使用 -j 來增加它。

這是一個範例,用於展示作業訂單未按送出的順序輸出。

seq 20 | parallel -j 20 'sleep $[RANDOM % 20]; echo '

我係統上的輸出是(你的可能會不同)

7
3
13
20
8
16
2
4
18
17
1
5
9
14
12
6
10
19
11
15

seq 20是一個將輸出數字 1-20 的命令。我通過管道將其並行處理,然後告訴它同時執行 20 個作業,以確保它們都同時啟動。'sleep $[\[RANDOM][1] % 20];正在使用 sleep 加上一個 zsh 參數,該參數將返回一個介於 1 到 20 之間的隨機數。每個作業都會休眠這個隨機數,然後echo. 一旦作業回顯,您將立即從並行獲取輸出。

你也可以做一些類似的事情來parallel --shuf改變工作順序

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