首页 > 解决方案 > 如何使用 xargs 并行执行数千条命令?

问题描述

我目前正在循环中通过 qsub 排队一堆工作

for fn in $FNS; do
    queue_job $(options_a $fn) $(options_b $fn)
done

queue_job是一个使用 qsub 将作业排队的脚本,options_a/b 是我编写的根据文件名添加一些作业选项的函数。我以这种方式排队最多 5k 个作业,我想立即将它们全部添加到队列中(或以更大的块,例如 40/次)而不是循环。

我知道我可以发送线路xargs并并行执行它们

??? | xargs -P 40 -I{} command {}

但我不确定如何将我的 for 循环翻译成xargs

标签: linuxbashxargs

解决方案


qsub界面允许一次提交一个作业 - 它不提供bulk提交,这将限制并行提交作业的优势(作业提交通常很快)。

对于特定情况,有两个 (bash) 函数(即options_aoptions_b),它们将根据文件名扩展为作业特定参数。正如评论所建议的那样,这可能会限制使用 xargs 直接执行 - 这些函数不太可能在路径中可用。

选项:

为其创建一个包装器,该包装器queue_job将获取(或包含)这些功能。使用来自 xargs 的包装器

xargs -P40 -I{} queue_job_x1 '{}'
queue_job_x1

#! /bin/bash
function options_a {
   ...
}

function option_b {
   ...
}

queue_job $(options_a $fn) $(options_b $fn)'

将相关函数放入.sh文件中可能是个好主意,该文件可以由多个脚本获取。


推荐阅读