虽然我最初的问题以不同的方式解决了(请参阅此问题下的评论线程,以及对此问题的编辑),但我能够在 Bash 中为 GNU Parallel 创建堆栈/LIFO。因此,我将编辑我的背景/问题以反映可能需要的情况。
我正在使用 GNU Parallel 通过 Bash 脚本处理文件。当处理文件时,会创建更多文件,并且需要将新命令添加到并行列表中。我无法并行提供完整的命令列表,因为信息是在处理初始文件时生成的。
我需要一种方法在并行运行时将行添加到并行列表中。
如果队列中没有任何内容,并行还需要等待新行,并在队列完成后退出。
首先我创建了一个fifo:
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 开始时才打印第二个已完成作业的输出。
使用GNU并行作为队列系统/批处理管理器时有一个小问题:在作业开始之前,您必须提交JobSlot数量的作业,之后您可以一次提交一个,如果有空闲槽位,作业将立即开始可用的。正在运行或已完成的作业的输出将被保留,并且仅在启动 JobSlots 个作业时才会打印(除非您使用 --ungroup 或 -u,在这种情况下会立即打印作业的输出)。例如。如果您有 10 个作业槽,则仅在作业 11 开始时才打印第一个已完成作业的输出,而仅在作业 12 开始时才打印第二个已完成作业的输出。