更新时间:2021-12-08 GMT+08:00
分享

读取文件控制并发

在基因数据处理流程中,经常需要读取某个文件的内容来控制并发任务,或者获取另一个步骤的“输出结果”来控制并发任务。如,把样本文件按照固定大小进行拆分之后,需要得到所有的拆分文件名集合。或者上一步是分布式处理的,需要得到结果的总和。

图1 读取文件控制并发

这种情况下,我们需要使用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功能之后,如果需要实现根据上一步的结果,动态并发执行任务,则可以通过如下方式完成:

图2 动态并发执行任务

这样可以通过执行自己熟悉的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

相关文档