如何在每个作业记录中运行 GNU 并行,每个核心 1 个进程

如何在每个作业记录中运行 GNU 并行,每个核心 1 个进程

我真正想做的是运行 X 数量的作业,并并行运行 X 数量的作业来测试 API 竞争条件。

我想出了这个

echo {1..10} | xargs -n1 | parallel -m 'echo "{}"';

打印

7 8 9
10
4 5 6
1 2 3

但我真正想看到的是(笔记顺序实际上并不重要)。

1
2
3
4
5
6
7
8
9
10

这些将一次并行处理 4 个(或者我有的任何数量的 cpu/核心,例如--jobs 4)。总共 10 次单独处决。

我试过这个

echo {1..10} | xargs -n1 | parallel --semaphore --block 3  -m 'echo -n "{} ";

但它似乎只打印一次。如果您的解决方案不需要 xargs ,这似乎是对默认记录分隔符是换行符这一想法的黑客攻击,但我也无法获得一个空间来像我想要的那样工作。

10是一个相当小的数字,但可以说它要大得多,1000

echo {1..1000} | xargs -n1 | parallel -j1000

印刷

parallel: Warning: Only enough file handles to run 60 jobs in parallel.
parallel: Warning: Running 'parallel -j0 -N 60 --pipe parallel -j0' or
parallel: Warning: raising 'ulimit -n' or 'nofile' in /etc/security/limits.conf
parallel: Warning: or /proc/sys/fs/file-max may help.

我实际上并不想要 1000 个进程,我想要一次 4 个进程,每个进程应该处理 1 条记录,因此当我完成时,它将执行 1000 次。

答案1

我想要一次4个进程,每个进程应该处理1条记录

parallel -j4 -k --no-notice 'echo "{}"' ::: {1..10}
  • -j4- 职位数量。并行运行最多 4 个作业

  • -k- 保持输出顺序与输入顺序相同。通常,作业完成后就会立即打印作业的输出

  • :::- 论点


输出:

1
2
3
4
5
6
7
8
9
10

答案2

seq 10 | parallel -j4 echo {}

或者如果你有 4 个核心:

seq 10 | parallel echo

相关内容