【问题标题】:How do I create a Stack or LIFO for GNU Parallel in Bash如何在 Bash 中为 GNU Parallel 创建堆栈或 LIFO
【发布时间】: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


【解决方案1】:

来自http://www.gnu.org/software/parallel/man.html#EXAMPLE:-GNU-Parallel-as-queue-system-batch-manager

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多