并行过程:在bash脚本中将输出追加到数组

时间:2018-07-26 17:01:50

标签: linux bash shell parallel-processing

我有一个for循环,其中调用了函数task。每次对该函数的调用都会返回一个附加到数组的字符串。我想并行处理此for循环。我尝试使用&,但似乎不起作用。

这是未并行化的代码。

task (){ sleep 1;echo "hello $1"; }
arr=()

for i in {1..3}; do
    arr+=("$(task $i)")
done

for i in "${arr[@]}"; do
    echo "$i x";
done

输出为:

hello 1 x
hello 2 x
hello 3 x

太好了!但是现在,当我尝试将其与

并行化时
[...]
for i in {1..3}; do
    arr+=("$(task $i)")&
done
wait
[...]

输出为空。

4 个答案:

答案 0 :(得分:3)

GNU并行擅长并行处理:-)

task (){ sleep 1;echo "hello $1"; }

# Make "task" known to sub shells
export -f task

# Do tasks in parallel
parallel -k task ::: {1..3}

示例输出

hello 1
hello 2
hello 3

我建议您这样做-但查尔斯(Charles)友善指出,这是一个已知的bash陷阱:

array=( $(parallel -k task ::: {1..3}) )

查尔斯建议的解决方案是:

IFS=$'\n' read -r -d '' -a array < <(parallel -k task ::: 1 2 3 && printf '\0')

答案 1 :(得分:0)

尝试将添加步骤封装到函数或临时脚本中,但是将项目发送到文件中。我认为您将需要一些我不记得的命令来处理文件锁定。看看您是否也需要导出内容。然后,在最后获取文件。像这样:

constructor(public appServices:AppServices) {
    this.rowData = this.assayDataList;
    this.columnDefs = [
      {
        //headerCheckboxSelection: true,
        //headerCheckboxSelectionFilteredOnly: true,
        checkboxSelection: true,
        width: 40,
        headerComponentParams: CustomheaderComponent
      },
      {
        headerName: "Date/Time",
        field: "createdDate",
        width: 230
      },
      {headerName: 'Assay Name', field: 'assayName', width: 240},
      {headerName: 'Samples', field: 'sampleCount', width: 100}

    ];

    this.gridOptions = {
      rowSelection: 'multiple',
      cacheBlockSize: 30,
      //maxBlocksInCache: 2,
      enableServerSideFilter: false,
      enableServerSideSorting: false,
      rowModelType: 'infinite',
      paginationAutoPageSize: true,
      suppressRowClickSelection: true
      //suppressCellSelection: true
    };

    this.frameworkComponents = { agColumnHeader: CustomheaderComponent };

  }

答案 2 :(得分:0)

您正在寻找parset(自20170422起成为GNU Parallel的一部分)或env_parset(自20171222起可用):

# If you have not run:
#    env_parallel --install
# and logged in again, then you can instead run this to activate (env_)parset:
. `which env_parallel.bash`

task (){
  echo "hello $1"
  sleep 1.$1
  perl -e 'print "binary\001\002\n"'
  sleep 1.$1
  echo output of parallel jobs do not mix
}
env_parset arr task ::: {1..3}
env_parset a,b,c task ::: {1..3}

echo "${arr[1]}" | xxd
echo "$b" | xxd
Bash / Ksh / Zsh(包括数组),ash /破折号(不包含数组)支持

parset

答案 3 :(得分:-2)

尝试将添加步骤封装到函数或临时脚本中。看看您是否也需要导出内容。像这样:

add() { arr+=(value); }
...
export -f add
...
add &