【问题标题】:Is it possible to distribute STDIN over parallel processes?是否可以通过并行进程分发 STDIN?
【发布时间】:2011-06-07 02:45:36
【问题描述】:

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

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

是否可以在分隔符上拆分它(在本例中为“===”)并通过标准输入将其提供给并行运行的命令?

因此,上面的示例输入将导致 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 并行,但我不知道如何。

【问题讨论】:

    标签: bash process parallel-processing stdin xargs


    【解决方案1】:

    GNU Parallel 从版本 20110205 开始可以做到这一点。

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

    【讨论】:

    • 这个答案可以使用更多解释:pipe 导致并行写入标准输入而不是传递参数,recend 是记录结束,即拆分字符串,rrs 代表删除记录开始,即删除'===\n'。除此之外,--keep-order 很有用。
    【解决方案2】:

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

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

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

    我有一个名为 tpipe 的自制程序,它类似于 Unix 的 tee 命令,但它会将其标准输入的(全部)副本写入每个进程,默认情况下也会写入标准输出.这可能是您需要的合适基础(它至少涵盖了它的流程管理部分)。如果您想要一份副本,请与我联系 - 请查看我的个人资料。


    如果您使用的是 Bash,则可以使用带有进程替换的常规 tee 来模拟 tpipe。请参阅此article 了解如何操作。

    另请参阅 SF 96245 以获取相同信息的另一个版本 - 以及一个名为 pee 的程序的链接,该程序与 tpipe 非常相似(相同的基本思想,在各个方面的实现略有不同)。

    【讨论】:

    • tpipepee 有何不同?
    • 我写过 tpipe,之前没听说过 pee。但是其他人有相同的基本要求并实施它并不令我感到惊讶。我不确定您是否能猜出通过 Google 搜索“小便”有多难(甚至“站点:gnu.org 小便”也会出现垃圾邮件)!所以,没有软件的网址,我无法为你比较和对比。
    • serverfault.com/questions/96245/… 显示正在使用的pee 并显示您在bash 中不需要peecat file | tee >(command1 >out1) >(command2 >out2)
    • @Ole:感谢您提供的网址。我注意到pee 在几个方面与tpipe 有不同的语义:最值得注意的是,tpipe 一直写入可用管道直到它们全部关闭,而不是像pee 那样在第一个错误时停止。如果bash 在所有感兴趣的平台上可靠地可用,bash 设施就很好,从而节省了我的工作。 (我答案尾部的 URL 指向与您相同的符号,但不是同一篇文章)。
    【解决方案3】:

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

    我对命名管道不是很熟悉,但我经常在这种情况下使用它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-02
      • 2011-08-01
      • 1970-01-01
      • 2013-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多