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

xen*_*ide 5 gnu parallelism gnu-parallel

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

我想出了这个

echo {1..10} | xargs -n1 | parallel -m 'echo "{}"';
Run Code Online (Sandbox Code Playgroud)

哪个打印

7 8 9
10
4 5 6
1 2 3
Run Code Online (Sandbox Code Playgroud)

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

1
2
3
4
5
6
7
8
9
10
Run Code Online (Sandbox Code Playgroud)

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

我试过这个

echo {1..10} | xargs -n1 | parallel --semaphore --block 3  -m 'echo -n "{} ";
Run Code Online (Sandbox Code Playgroud)

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

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

echo {1..1000} | xargs -n1 | parallel -j1000
Run Code Online (Sandbox Code Playgroud)

印刷

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.
Run Code Online (Sandbox Code Playgroud)

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

Rom*_*est 6

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

parallel -j4 -k --no-notice 'echo "{}"' ::: {1..10}
Run Code Online (Sandbox Code Playgroud)
  • -j4- 职位数量。并行运行多达 4 个作业

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

  • ::: - 参数


输出:

1
2
3
4
5
6
7
8
9
10
Run Code Online (Sandbox Code Playgroud)

  • 与 shell 变量相反,GNU 并行替换字符串不应加引号。在大多数情况下(比如这里),它没有什么害处,但请尝试将其作为出错位置的示例:`parallel "echo '{}'" ::: '$'` (2认同)