我试图通过一个简单的示例来了解 shell 脚本中的并行处理以及在输出中确定性地(无随机顺序)顺序附加值。下面是代码片段:
x=""
appendnum() {
num=$1; x=`echo $x$num`
}
for no in {0..10}
do
appendnum $no &
done
wait $(jobs -rp)
echo $x
预期的输出是 012345678910,但它会产生一个空值。我什至尝试迭代 PID 以等待它完成,但没有成功。我希望主线程等到每个并行进程完成。附加数字只是一个例子。
我的问题陈述如下所示:考虑到我有 3 个任务,我想要响应列表,例如[responseof(task1),responseof(task2),responseof(task3)]
. 任务数最多可达到 50 个。无论任务数如何,我的响应时间都应该相同。这样做的最有效和正确的方法是什么?
如果我对您的理解正确,您希望:
考虑到这一点,您可以尝试以下方法:
执行的第一个任务花费的时间最长,但由于我们添加了
-k
选项,parallel
实用程序将保持顺序并最终输出没有该
-k
选项,输出将反转,并在命令完成时出现如果您需要更多信息,请查看教程:https ://www.gnu.org/software/parallel/parallel_tutorial.html
你缺少的一些东西:
appendnum $no &
,该appendnum
函数 无法修改x
主 shell 进程中的变量。你可以得到类似你试图得到的行为:
您将获得数字 0 到 10 写入文件
TR007.out
。wait
它本身(不带参数)将等待所有子进程。1a
/1b
/2a
/2b
/3a
/3b
——或者你可能会得到2a
/2b
/1a
/1b
/3a
/3b
,或者你可能会得到2a
/1a
/2b
/3a
/3b
/1b
,或者更糟。让异步进程写入同一个文件是一个坏主意。你可能应该做类似的事情
其他注意事项:$(command)
做同样的事情。你应该坚持使用表格。`command`
$(command)
x=`echo $x$num`
x=$(echo $x$num)
x="$x$num"
appendnum $no
;做appendnum "$no"
等parset
是为此而建的:例如:
parset
是 GNU 并行的一部分。