Shell中的并行分配

卢卡萨尔

我有以下bash脚本:

for (( i = 1; i <= $3; i++ ))
do
    x=$($1 bench 4 2>&1|grep "Nodes\/second"|sed "s/.*: \([0-9]*\)/\1/") &
    y=$($2 bench 4 2>&1|grep "Nodes\/second"|sed "s/.*: \([0-9]*\)/\1/")
    echo $x, $y
done

我用3个参数运行:

  1. 第一个程序:结果$($1 bench 4 2>&1|grep "Nodes\/second"|sed "s/.*: \([0-9]*\)/\1/")是一个数字。
  2. 第二个程序。我要去。
  3. 迭代次数

关键是我想并行运行x=...y=...,这就是为什么我使用&符的原因。这很重要,必须以这种方式进行并行化(对x和y运行第一次迭代,在第二次迭代之前等待两者都完成,等等)

该脚本的结果是未分配x,仅y是:

$ ./bench.sh ./Stockfish/cerr ./Stockfish/master 50
, 2417071
, 2440128
, 2439481
etc.

为什么?

索伦

问题是您必须将它们都放在后台(因此在两行的末尾放置和号),然后wait才能完成作业-否则,您不确定在第二次迭代开始之前第一项工作是否完成。

第二个问题是您无法使用来从后台作业中获取输出x$(...)&,因此您将不得不将输出重定向到文件,然后在作业完成后读取文件输出。

for (( i = 1; i <= $3; i++ ))
do
    ($1 bench 4 2>&1|grep "Nodes\/second"|sed "s/.*: \([0-9]*\)/\1/" >/tmp/x) &
    ($2 bench 4 2>&1|grep "Nodes\/second"|sed "s/.*: \([0-9]*\)/\1/" >/tmp/y) & 
    wait
    read x </tmp/x
    read y </tmp/y
    echo $x, $y
done

另外,作为额外的奖励,请尝试阅读手册页,以获取xargs-在大多数情况下,这种循环非常不必要,而且更加安全。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在 spark scala shell 中并行化集合

来自分类Dev

在 shell 中并行化的最佳方法

来自分类Dev

Shell脚本中的变量分配

来自分类Dev

Julia 1.5中带有嵌套循环的并行分配操作

来自分类Dev

如何在bash中并行分配环境变量

来自分类Dev

Julia 中的并行计算和错误分配的内核数量

来自分类Dev

Shell脚本中变量分配中的空格

来自分类Dev

Ruby并行分配

来自分类Dev

Ruby并行分配

来自分类Dev

sqoop 作业 shell 脚本在 oozie 中并行执行

来自分类Dev

Shell脚本中的变量分配约定

来自分类Dev

使用Shell脚本中的Makefile分配

来自分类Dev

在并行代码中并行

来自分类Dev

并行化shell脚本

来自分类Dev

迅速:if-let与并行分配

来自分类Dev

在具有并行任务的Mono / C#中无法释放内存。如何解释分配?

来自分类Dev

定时在shell中并行运行的多个命令并将其保存在文件中

来自分类Dev

如何在Tupfile中为shell命令的输出分配变量?

来自分类Dev

在shell变量分配中自动转换换行符

来自分类Dev

将“ awk”或“ nawk”分配给shell脚本中的变量

来自分类Dev

在Gnome Shell中,为Ctrl键分配的操作是什么?

来自分类Dev

在shell中为动态命名的变量分配带空格的值

来自分类Dev

如何在shell中“释放”分配给变量的内存

来自分类Dev

shell C 中的动态分配和分段错误

来自分类Dev

并行Shell脚本的各个部分

来自分类常见问题

识别shell中触发的并行进程的结束时间戳

来自分类Dev

对文件中的每一行并行运行Shell脚本

来自分类Dev

识别shell中触发的并行进程的结束时间戳

来自分类Dev

对文件中的每一行并行运行Shell脚本