首页 > 解决方案 > 并行进程:将输出附加到 bash 脚本中的数组

问题描述

我有一个 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
[...]

输出为空。

标签: linuxbashshellparallel-processing

解决方案


GNU Parallel擅长并行处理 :-)

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

我建议你这样做——但查尔斯好心地指出这是一个已知的bash陷阱:

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

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

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

推荐阅读