如何在 Bash 中为 GNU Parallel 创建堆栈或 LIFO

问题描述 投票:0回答:1

虽然我最初的问题以不同的方式解决了(请参阅此问题下的评论线程,以及对此问题的编辑),但我能够在 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 开始时才打印第二个已完成作业的输出。

bash parallel-processing gnu gnu-parallel lifo
1个回答
3
投票

来自 https://www.gnu.org/software/parallel/parallel_examples.html#example-gnu-parallel-as-queue-system-batch-manager

使用GNU并行作为队列系统/批处理管理器时有一个小问题:在作业开始之前,您必须提交JobSlot数量的作业,之后您可以一次提交一个,如果有空闲槽位,作业将立即开始可用的。正在运行或已完成的作业的输出将被保留,并且仅在启动 JobSlots 个作业时才会打印(除非您使用 --ungroup 或 -u,在这种情况下会立即打印作业的输出)。例如。如果您有 10 个作业槽,则仅在作业 11 开始时才打印第一个已完成作业的输出,而仅在作业 12 开始时才打印第二个已完成作业的输出。

© www.soinside.com 2019 - 2024. All rights reserved.