读取文件控制并发
在基因数据处理流程中,经常需要读取某个文件的内容来控制并发任务,或者获取另一个步骤的“输出结果”来控制并发任务。如,把样本文件按照固定大小进行拆分之后,需要得到所有的拆分文件名集合。或者上一步是分布式处理的,需要得到结果的总和。
这种情况下,我们需要使用GCS语法中特定的功能,get_result函数来获得。
确定性的并发任务,GCS语法如下:
job-2:
commands_iter:
command: echo ${1} ${2}
vars_iter:
- [A, B, C] # <==== 注意这里,表示${1} 的并发数量(范围)
- [0, 1]
上述GCS语法中,[A, B, C] 表示并发数量为3数量。而动态的并发,就是数组[]中的值是上一步结果 。如下:
job-2:
commands_iter:
command: echo ${1} ${2}
vars_iter:
- get_result(job-1) # <==== 注意这里,数组结果是根据指定任务的stdout动态“计算出来的”
- [0, 1]
真正get到的result是指定步骤的标准输出,即“stdout”。
例如 job-1 的stdout为“1 2 3 4”,那么上一步的结果就是
vars_iter:
- ["1 2 3 4"]
注意,这里数组里面只有一个成员。也就是只有一个并发。
如果希望,每一个作为并发,可以加入“分割符”进行切分。具体语法见get_result函数。
vars_iter:
- get_result( job-1, " ")
会得到:
vars_iter:
- ["1", "2", "3", "4"]
这样就得到了4个并发,每个变量分别为"1", "2", "3", "4"。其中,分隔符是是任意的字符串。
在拥有get_result功能之后,如果需要实现根据上一步的结果,动态并发执行任务,则可以通过如下方式完成:
这样可以通过执行自己熟悉的shell命令,读取某个文件内容,或者列出目录中特定的文件,来得到想要的并发行为。
示例
job-list:
type: GCS.Job
tool: nginx:new-latest
commands: # <== (1) 列出目录中文件
- |
for i in `ls ${sfs}/${output-folder}`; do
echo ${i}
done
job-a:
type: GCS.Job
tool: nginx:new-latest
commands_iter:
command: echo ${output-prefix}job-c-${item} >> ${sfs}/${output-folder}/${1}; # <== (3) 迭代式并发,替换变量 ${1}
vars_iter:
- get_result(job-list, '\n') # <== (2) 把job-list输出,按一行一个,切分为并发数组
depends:
- target: job-list
type: whole