gpt4 book ai didi

linux - 并行进程 : appending outputs to an array in a bash script

转载 作者:太空宇宙 更新时间:2023-11-04 10:07:14 28 4
gpt4 key购买 nike

我有一个 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')

关于linux - 并行进程 : appending outputs to an array in a bash script,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51544071/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com