【问题标题】:Multiprocessing in Shell Script (BASH)Shell 脚本中的多处理 (BASH)
【发布时间】:2012-11-20 10:18:59
【问题描述】:

我已经编写了一个脚本,我想做的是通过使用子处理或后台处理或我需要使用的东西来加快计算速度,让它尽可能快地运行。

所以我想在我的脚本中使用 & 符号来尽可能地加快处理速度,但是当我把它放在这里时,我没有得到结果。

这是我写的函数,正在尝试改进 apon。

InTri(){
    while read line
    do
        V1X=$(echo "$line" | awk '{print $1}') &
        V1Z=$(echo "$line" | awk '{print $2}') &
        V2X=$(echo "$line" | awk '{print $3}') &
        V2Z=$(echo "$line" | awk '{print $4}') &
        V3X=$(echo "$line" | awk '{print $5}') &
        V3Z=$(echo "$line" | awk '{print $6}') &
        run=$(echo "$line" | awk '{print $7}') &
        wait
        echo "$V1X $V1Z $V2X $V2Z $V3X $V3Z $run"
    done < <(mysql -u root -ppassword LightCycle -N -e "SELECT V1X, V1Z, V2X, V2Z, V3X, V3Z, ID FROM Temp3 WHERE (V1X <= $x OR V2X <= $x OR V3X <= $x) AND (V1X >= $x OR V2X >= $x OR V3X >= $x) AND (V1Z <= $z OR V2Z <= $z OR V3Z <= $z) AND (V1Z >= $z OR V2Z >= $z OR V3Z >= $z);")
}

我已经阅读了“man bash”(或者我能理解的内容),但我不明白为什么这不起作用。

帮助! :)

感谢任何人,非常感谢您的意见。

【问题讨论】:

  • 收集这些变量后,您想做什么

标签: linux multithreading bash shell multiprocessing


【解决方案1】:

您可能认为创建更多进程会使其更快,但实际上可能会因为创建新进程和所有管道的开销而使其变慢。

为什么不简单地执行以下操作?

mysql -u root -ppassword LightCycle -N -e "SELECT V1X, V1Z, V2X, V2Z, V3X, V3Z, ID FROM Temp3 WHERE (V1X <= $x OR V2X <= $x OR V3X <= $x) AND (V1X >= $x OR V2X >= $x OR V3X >= $x) AND (V1Z <= $z OR V2Z <= $z OR V3Z <= $z) AND (V1Z >= $z OR V2Z >= $z OR V3Z >= $z);" | awk '{print $1" "$2" "$3" "$4" "$5" "$6" "$7}'

或者如果你想将它们读入变量:

while read V1X V1Z V2X V2Z V3X V3Z run
do
  echo "$V1X $V1Z $V2X $V2Z $V3X $V3Z $run"
done < <(mysql -u root -ppassword LightCycle -N -e "SELECT V1X, V1Z, V2X, V2Z, V3X, V3Z, ID FROM Temp3 WHERE (V1X <= $x OR V2X <= $x OR V3X <= $x) AND (V1X >= $x OR V2X >= $x OR V3X >= $x) AND (V1Z <= $z OR V2Z <= $z OR V3Z <= $z) AND (V1Z >= $z OR V2Z >= $z OR V3Z >= $z);")

【讨论】:

  • 感谢您的输入加快了“真正的 0m0.793” :) 我学到了一些东西 :) 很棒
【解决方案2】:

&amp; 行中发生的任何事情都发生在子进程中,无法修改父进程的环境。您可能需要打开管道并在父进程中读取它们。对于与您的示例执行成本相当的任务,不值得付出努力。

在这个例子中你可以这样做

cat <(echo "$line" | awk '{print $1}') <(echo "$line" | awk '{print $1}') ...

而不是整个循环体。

【讨论】:

  • 好的,但是使用管道每个进程在开始之前等待其前身完成。我正在处理总共 4800 亿个点的 26000 个三角形,任何小的速度增加都会比正在运行的计算数量大。你在这里看到的只是实际运行的代码的一小部分,它只是我用来解决这个问题的最佳示例。
  • 是否有人等谁,取决于你是怎么做的。例如,我认为在上面的代码中没有等待的理由。当然,可以测试一下。至于您的特定任务,我不确定 bash 是不是正确的工具。
  • @TolMera,试试这个来测试:cat &lt;(echo a &gt;&amp;2; sleep 2 ; echo b &gt;&amp;2) &lt;(echo c &gt;&amp;2 ; sleep 3 ; echo d &gt;&amp;2)
【解决方案3】:

如果你觉得你的程序因为这 7 个 awk 命令而变慢了,你可以在没有任何 awk 的情况下做这样的事情:

$ line="1 2 3 4 5 6 7"
$ a=($line)
$ echo ${a[0]}
1
$ echo ${a[1]}
2
$ echo ${a[@]}
1 2 3 4 5 6 7

其中“a”是一个数组,其中包含行变量的所有元素。

【讨论】:

    【解决方案4】:

    为了让上面的脚本正常工作,我只需要在“等待”之前删除 &

    InTri(){
        while read line
        do
            V1X=$(echo "$line" | awk '{print $1}') &
            V1Z=$(echo "$line" | awk '{print $2}') &
            V2X=$(echo "$line" | awk '{print $3}') &
            V2Z=$(echo "$line" | awk '{print $4}') &
            V3X=$(echo "$line" | awk '{print $5}') &
            V3Z=$(echo "$line" | awk '{print $6}') &
            run=$(echo "$line" | awk '{print $7}') 
            wait
            echo "$V1X $V1Z $V2X $V2Z $V3X $V3Z $run"
        done < <(mysql -u root -ppassword LightCycle -N -e "SELECT V1X, V1Z, V2X, V2Z, V3X, V3Z, ID FROM Temp3 WHERE (V1X <= $x OR V2X <= $x OR V3X <= $x) AND (V1X >= $x OR V2X >= $x OR V3X >= $x) AND (V1Z <= $z OR V2Z <= $z OR V3Z <= $z) AND (V1Z >= $z OR V2Z >= $z OR V3Z >= $z);")
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-24
      • 2015-05-17
      • 2013-01-14
      • 1970-01-01
      • 1970-01-01
      • 2013-08-30
      • 1970-01-01
      相关资源
      最近更新 更多