我知道 GNU 并行缓冲 std/stderr 因为它不希望作业输出被破坏,但是如果我使用 , 运行我的作业parallel do_something ::: task_1 task_2 task_3
,是否有立即显示 task_1 的输出,然后在 task_1 完成后,task_2 达到其当前值输出等
如果Parallel不能解决这个问题,还有其他类似的程序可以解决吗?
答案1
从版本 20160422 开始,您可以执行以下操作:
parallel -k --lb do_something ::: task_1 task_2 task_3
答案2
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
事情打乱工作顺序。