【问题标题】:Xargs parallelism in BashBash 中的 Xargs 并行性
【发布时间】:2015-02-28 21:18:43
【问题描述】:

所以我在 BASH 中有这个我试图理解的函数 - 它使用并行性:

function get_cache_files() {
    ## The maximum number of parallel processes. 16 since the cache
    ## naming scheme is hex based.
    local max_parallel=${3-16}
    ## Get the cache files running grep in parallel for each top level
    ## cache dir.
    find $2 -maxdepth 1 -type d | xargs -P $max_parallel -n 1 grep -Rl "KEY:.*$1" | sort -u
} # get_cache_files

所以我的问题:

  1. 评论:“16 因为缓存命名方案是基于十六进制的” - 命名示例如下: php2-mindaugasb.c9.io/5c/c6/348e9a5b0e11fb6cd5948155c02cc65c - 当命名方案基于 HEX(十六进制系统)时,为什么使用 16 个进程很重要?
  2. XARGS 的 -P 选项适用于 max-procs:

一次最多运行 max-procs 个进程;默认值为 1。如果 max-procs 为 0,xargs 将一次运行尽可能多的进程。将 -n 选项与 -P 一起使用;否则很可能只有一名执行官会被完成。

好的,那么:“xargs -P $max_parallel -n 1”是正确的,将启动 16 个进程?或者 n 也应该等于 $max_parallel ?

  1. 据我了解,并行化的条件是:

    1. 将对其执行操作的资源的独立性(如将对其执行操作的类似文件);
    2. 在独立的计算机上执行操作;

    还有哪些其他条件可以并行化?

【问题讨论】:

    标签: linux bash shell command-line-arguments xargs


    【解决方案1】:

    好的,那么:“xargs -P $max_parallel -n 1”是正确的,将启动 16 个进程?还是 n 也应该等于 $max_parallel?

    想想商店里的几个账单柜台和大量等待支付账单的顾客。 -P 类似地是点钞机的数量(这里是 16 个)。 -n 将是一个柜台一次能够处理的客户数量(此处为 1)。在这种情况下,很容易在每个柜台上描绘出大致相等大小的队列,对吧?

    从问题的角度来看,max_parallel=${3-16} 表示如果 $3 参数没有传递给函数,则变量设置为 16。 xargs 启动 grep 的 16 个(-P 参数)并行进程。每个进程从 xargs 的标准输入 中获得 恰好 一行(-n 参数)作为最后一个命令行参数。在这种情况下,xargs 的标准输入是 find 命令的输出。总的来说,find 命令将列出所有目录,它的输出将被 16 个 grep 进程逐行消耗。每个 grep 进程将被调用为:

    grep -R1 "KEY:.*$1" <one line from find-output/xargs-input>
    

    评论:“16 因为缓存命名方案是基于十六进制的” - 命名示例是这样的:php2-mindaugasb.c9.io/5c/c6/348e9a5b0e11fb6cd5948155c02cc65c - 为什么在命名方案为时使用 16 个进程很重要基于 HEX(十六进制)?

    我无法弄清楚这背后的逻辑;但我认为更多的是做数据的分布和数量。如果 find 的输出总行数是 16 的倍数,那么它可能有些有意义。

    【讨论】:

    • 我喜欢这个。需要注意的一点是,max_parallel=${3-16} 本质上意味着 max_parallel 如果传递则设置为 $3,否则默认为 16
    • @1_CR 哦,我错过了关于那部分的文章。让我将其添加到我的答案中。谢谢!
    • 是的,我也无法弄清楚她特定数量的并行背后的逻辑 - 就我所见,输出并没有偏向 n*16 并且它使用排序来获得唯一性 "sort -u “最后消除重复 - 你能告诉我,如果它产生重复,为什么要使用并行性?对我来说似乎没有意义
    猜你喜欢
    • 1970-01-01
    • 2023-04-02
    • 2015-09-15
    • 1970-01-01
    • 2022-01-26
    • 2019-12-07
    • 2012-04-05
    • 1970-01-01
    • 2011-12-26
    相关资源
    最近更新 更多