【发布时间】:2015-08-25 17:37:38
【问题描述】:
虽然我的原始问题以不同的方式解决(请参阅此问题下的评论线程,以及对此问题的编辑),但我能够在 Bash 中为 GNU Parallel 创建一个堆栈/LIFO。因此,我将编辑我的背景/问题以反映可能需要它的情况。
背景
我正在使用 GNU Parallel 来处理带有 Bash 脚本的文件。随着文件的处理,会创建更多文件,并且需要将新命令添加到并行列表中。我无法并行提供完整的命令列表,因为在处理初始文件时会生成信息。
我需要一种在并行运行时将行添加到并行列表的方法。
如果队列中没有任何内容,并行还需要等待新行,并在队列完成后退出。
解决方案
首先我创建了一个先进先出:
mkfifo /tmp/fifo
接下来我创建了一个 bash 文件,该文件作为文件并将输出通过管道传输到并行,它检查 end_of_file 行。 (我在接受的答案以及here 的帮助下写了这篇文章)
#!/bin/bash
while true;
do
cat /tmp/fifo
done | parallel --ungroup --gnu --eof "end_of_file" "{}"
然后我用这个命令写入管道,在并行队列中添加行:
echo "command here" > /tmp/fifo
通过此设置,所有新命令都将添加到队列中。 一旦队列已满并行将开始处理它。这意味着如果您有 32 个作业(32 个处理器)的插槽,那么您将需要添加 32 个作业才能启动队列。
如果并行占用了它的所有处理器,它将暂停作业,直到有一个处理器可用。
通过使用--ungroup 参数,一旦队列已满,并行将处理/输出作业,因为它们被添加到队列中。
没有--ungroup 参数,并行等待直到需要一个新槽来完成作业。从接受的答案:
正在运行或已完成的作业的输出将被保留,并且只会在 JobSlots 更多作业已启动时打印(除非您使用 --ungroup 或 -u,在这种情况下,作业的输出会立即打印)。例如。如果您有 10 个作业槽,则仅在作业 11 开始时打印第一个已完成作业的输出,而仅在作业 12 开始时打印第二个已完成作业的输出。
【问题讨论】:
-
A做完了,B-E可以并行运行吗?还是C依赖B来完成?
-
C 依赖于 B,D 依赖于 C 等等。
-
如果它们依赖,那么我看不出如何使用 CPU 比使用 A-E 制作函数更好,并为每个文件运行该函数 - 为每个 CPU 并行运行一个。在什么情况下您的 CPU 会闲置而不需要闲置?
-
@OleTange 你是对的。我应该好好考虑一下。哪个处理器处理数字无关紧要,B必须等待A。所以总时间不能小于最大的A+B+C+D+E时间。
-
...然后解决方案突然变得简单
标签: bash parallel-processing gnu gnu-parallel lifo