为什么" while"并发在shell脚本中运行越来越慢?

时间:2016-07-03 09:08:39

标签: linux shell

我想通过使用shell的并发函数来一次使用更多cpus压缩大量文件:

#!/bin/bash
#set -x

function zip_data()
{
while true
do
{
echo "do zip something" 
}&
done
}

zip_data  
wait

在开始时,循环的速度很快。 但随着运行时循环次数的增加, 速度越来越慢。 为什么???

我认为原因可能是有太多的子进程在运行。 所以我尝试让while函数一次运行一个循环,如下所示:

#!/bin/bash
#set -x

function trap_exit
{
exec 1000>&-;exec 1000<&-
kill -9 0
}

trap 'trap_exit; exit 2' 1 2 3 15 9

mkfifo testfifo ; exec 1000<>testfifo ; rm -rf testfifo

function zip_data()
{
echo >&1000

while true
read -u 1000
do
{
echo "do something" 
echo >&1000 
}&
done
}

zip_data 
wait

然而这种现象和以前一样。

所以我不明白为什么跑步时速度越来越慢的原因。

今天我尝试这样但它不起作用

#!/bin/bash
#set -x
c=0
while true
do
        c=$(jobs -p | wc -l)
        while [ $c -ge 20 ]; do
                c=$(jobs -p | wc -l)
                sleep 0.01
        done

        {
        echo "$c" 
        sleep 0.8
        }&


done

所以我尝试其他方式来完成这个功能,谢谢!

#!/bin/bash
#set -x

function EXPECT_FUNC()
{
para=$1 
while true
do
{
do something $1
}
done

}

EXPECT_FUNC 1 &
EXPECT_FUNC 2 &
EXPECT_FUNC 3 &
EXPECT_FUNC 4 &


wait

1 个答案:

答案 0 :(得分:2)

任何单线程util都可以在管理良好的并发线程中运行parallelman parallel提供了许多例子,例如:

   Create a directory for each zip-file and unzip it in that dir:

       parallel 'mkdir {.}; cd {.}; unzip ../{}' ::: *.zip

   Recompress all .gz files in current directory using bzip2 running 1 job
   per CPU core in parallel:

       parallel "zcat {} | bzip2 >{.}.bz2 && rm {}" ::: *.gz

仅适用于gzip的一个特别有趣的示例显示了如何使用多个CPU同时使用单线程归档来运行一个归档,其中听起来不可能:

    To process a big file or some output you can use --pipe to split up 
    the data into blocks and pipe the blocks into the processing program.

    If the program is gzip -9 you can do:

        cat bigfile | parallel --pipe --recend '' -k gzip -9 >bigfile.gz

    This will split bigfile into blocks of 1 MB and pass that to 
    gzip -9 in parallel. One gzip will be run per CPU core. The output
    of gzip -9 will be kept in order and saved to bigfile.gz

如果parallel过于复杂,以下是一些内置并行存档的压缩工具: