如何在Bash中为GNU并行创建堆栈或后进先出

如何在Bash中为GNU并行创建堆栈或后进先出,bash,parallel-processing,gnu,gnu-parallel,lifo,Bash,Parallel Processing,Gnu,Gnu Parallel,Lifo,虽然我最初的问题是以不同的方式解决的(请参阅此问题下的评论线程,以及对此问题的编辑),但我能够在Bash中为GNU并行创建堆栈/后进先出。因此,我将编辑我的背景/问题,以反映可能需要的情况 背景 我使用GNU并行处理带有Bash脚本的文件。随着文件的处理,会创建更多的文件,需要将新命令添加到parallel的列表中。我不能给parallel一个完整的命令列表,因为信息是在处理初始文件时生成的 我需要一种方法来添加行并行的列表,而它正在运行 如果队列中没有任何内容,Parallel还需要等待新行,

虽然我最初的问题是以不同的方式解决的(请参阅此问题下的评论线程,以及对此问题的编辑),但我能够在Bash中为GNU并行创建堆栈/后进先出。因此,我将编辑我的背景/问题,以反映可能需要的情况

背景 我使用GNU并行处理带有Bash脚本的文件。随着文件的处理,会创建更多的文件,需要将新命令添加到parallel的列表中。我不能给parallel一个完整的命令列表,因为信息是在处理初始文件时生成的

我需要一种方法来添加行并行的列表,而它正在运行

如果队列中没有任何内容,Parallel还需要等待新行,并在队列完成后退出

解决方案 首先,我创建了一个fifo:

mkfifo /tmp/fifo
接下来,我创建了一个bash文件,cat就是这个文件,并将输出传输到parallel,它检查文件行的结尾。(我写这篇文章是在接受答案以及

然后,我使用以下命令写入管道,向parallel的队列添加行:

echo "command here" > /tmp/fifo
通过此设置,所有新命令都将添加到队列中一旦队列已满parallel将开始处理它。这意味着,如果您有32个作业(32个处理器)的插槽,则需要添加32个作业才能启动队列

如果parallel占用了它的所有处理器,它将暂停作业,直到有一个处理器可用为止

通过使用
--ungroup
参数,parallel将处理/输出作业,因为一旦队列已满,这些作业将被添加到队列中

如果没有
--ungroup
参数,parallel将等待直到需要一个新插槽来完成作业。根据公认的答案:

正在运行或已完成的作业的输出将被保留,并且仅当作业插槽中有更多作业已启动时才会打印(除非使用--ungroup或-u,在这种情况下,将立即打印作业的输出)。例如,如果您有10个作业槽,则第一个完成的作业的输出仅在作业11开始时打印,第二个完成的作业的输出仅在作业12开始时打印

当使用GNU parallel作为队列系统/批处理管理器时,有一个小问题:您必须在作业开始之前提交作业插槽数量,然后您可以一次提交一个,如果可用插槽可用,作业将立即开始。正在运行或已完成的作业的输出将被保留,并且仅当作业插槽中有更多作业已启动时才会打印(除非使用--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时间。。。。然后突然,解决方案变得非常简单
echo "command here" > /tmp/fifo