Bash中的Xargs并行性

时间:2015-01-02 14:43:40

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

所以我在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:
  3.   

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

    好的,所以:" xargs -P $ max_parallel -n 1"是正确的,将启动16个流程?或者n应该等于$ max_parallel?

    1. 据我所知,并行化的条件是:

      1. 将执行操作的资源的独立性(与将要执行操作的类似文件一样);
      2. 在独立计算机上执行操作;
      3. 有什么其他条件,可以并行的情况?

1 个答案:

答案 0 :(得分:4)

  

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

想想商店里的几个账单柜台以及等待支付账单的大量客户。类似的-P将是账单计数器的数量(此处为16)。 -n将是一个计数器一次能够处理的客户数量(此处为1)。在这种情况下,它很容易在每个计数器上显示大小相等的队列,对吧?

从问题的角度来看,max_parallel=${3-16}表示如果$ 3参数未传递给函数,则变量设置为16。 xargs启动-P的16个{grep参数)并行流程。每个进程从xargs 的 stdin中获取完全一行(-n参数)作为最后一个命令行参数。在这种情况下,xargs的stdin是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的倍数,那么它可能会使某些有意义。