是否可以在并行进程上分配STDIN?

时间:2011-01-11 11:07:41

标签: bash process parallel-processing stdin xargs

在STDIN上给出以下示例输入:

foo
bar bar
baz
===
qux
bla
===
def
zzz yyy

是否可以将它拆分为分隔符(在本例中为'===')并通过stdin将其提供给并行运行的命令?

因此上面的示例输入将导致3个并行进程(例如名为do.sh的命令),其中每个实例都接收到STDIN上的部分数据,如下所示:

do.sh(实例1)通过STDIN接收:

foo
bar bar
baz

do.sh(实例2)通过STDIN接收:

qux
bla

do.sh(实例3)通过STDIN接收此内容:

def
zzz yyy

我认为使用xargs或GNU parallel可以做到这样的事情,但我不知道如何。

3 个答案:

答案 0 :(得分:11)

GNU Parallel可以从版本20110205开始。

cat | parallel --pipe --recend '===\n' --rrs do_stuff

答案 1 :(得分:2)

一般来说,没有。这种评估的原因之一是从文件而不是终端读取标准I / O读取数据块 - 一次BUFSIZ字节,其中BUFSIZ通常是2的幂,如512或更大。如果数据在文件中,则一个进程将读取显示的整个文件 - 如果它们共享相同的打开文件描述,则其他进程将看不到任何内容(类似于文件描述符,但是多个文件描述符可以共享相同的打开文件描述,以及可以在不同的进程中),或者如果它们不共享相同的打开文件描述,则会读取整个相同的文件。

因此,您需要一个进程来读取知道它需要将信息分发到三个进程的文件 - 并且它需要知道如何连接到这三个进程。可能是您的分发程序运行三个进程并写入其单独的管道输入。或者可能是分发服务器连接到三个套接字并写入不同的套接字。

您的示例未显示/描述如果标记分隔了37个部分会发生什么。

我有一个名为tpipe的家庭酿造程序,就像Unix tee命令一样,但是它会将(所有)标准输入的副本写入每个进程,并写入标准默认输出也是如此。这可能是您需要的合适基础(至少涵盖了它的过程管理部分)。如果您需要副本,请与我联系 - 请参阅我的个人资料。


如果您使用Bash,则可以使用常规tee进行流程替换来模拟tpipe。有关如何使用的说明,请参阅此article

另请参阅SF 96245了解相同信息的其他版本 - 以及指向pee的程序的链接,该程序与tpipe非常相似(相同的基本构思,各种执行略有不同)方面)。

答案 2 :(得分:1)

您可以使用named pipes执行此操作。命名管道允许您将标准管道视为文件。您可以拥有多个命名管道,并让其他程序处理它们。

我对命名管道并不熟悉,但我在这种情况下不时使用它们。