我有一个 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
[...]
输出为空。
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
我建议你这样做 - 但 Charles 友善地指出这是一个已知的 bash
陷阱:
array=( $(parallel -k task ::: {1..3}) )
Charles 建议的解决方案是:
IFS=$'\n' read -r -d '' -a array < <(parallel -k task ::: 1 2 3 && printf '\0')
我是一名优秀的程序员,十分优秀!