Shell
GNU Parallel:立即按作業順序一次顯示作業 stderr/stdout
我知道 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
改變工作順序。