【问题标题】:How to get results from parallel sub-shells in Bash?如何从 Bash 中的并行子 shell 中获取结果?
【发布时间】:2016-08-17 00:39:53
【问题描述】:

我正在运行大约 100 个子 shell,并尝试回显它们的所有结果。代码:

#!/usr/bin/env bash
function some_function(){} #spider
# ... ...
for i in {1..100}
do
  array[$i]=some_function $i &
done
echo ${array[@]}

我知道这些评估发生在子 shell 中,所以我什么也得不到。
但我不能使用

echo $(some_function $i) &

而是在循环中,因为 racing,这使得所有内容都无法阅读。

不知道为什么

(set -a; array[$i]=some_function $i; set +a)&

if true; then set -a; array[$i]=some_function $i; set +a; fi &

也没有用。

我已尽力避免在其他地方使用任何临时文件或 fifo 或 fd。

正确的做法是什么?

编辑:我想知道 GNU-Parallel 是否可以工作,尽管它不在 msys2 中。

【问题讨论】:

  • GNU parallel 只是另一种启动后台进程的方式;它本身是另一个外部进程,所以不能在调用shell中设置shell变量。

标签: linux multithreading bash shell parallel-processing


【解决方案1】:

子shell不能设置其父变量(或数组元素)的值。您唯一的选择是将输出写入文件。

for i in {1..100}; do
    some_function "$i" > "tmp_$i.txt" &
done

wait

for i in {1..100}; do
    array[i]=$(<"tmp_$i.txt")
done

(我认为可能有一种使用协同进程的方法,但似乎您一次不能拥有多个协同进程。)

【讨论】:

  • 锁定一个文件/fifo/fd然后依次写入,或者通过引用传递一些变量呢?
  • Err...我想知道使用 fifo 是否会阻塞子 shell,因为数组的元素是一一计算的?
  • 任何单个文件(常规文件或 fifo)都会为您提供相同的竞争条件。
猜你喜欢
  • 2014-11-03
  • 2013-01-03
  • 1970-01-01
  • 2011-08-28
  • 1970-01-01
  • 2012-03-22
  • 1970-01-01
  • 2012-09-08
相关资源
最近更新 更多