我想通过使用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
答案 0 :(得分:2)
任何单线程util都可以在管理良好的并发线程中运行parallel。 man 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
过于复杂,以下是一些内置并行存档的压缩工具: