使用parallel并行shell for语句的研究和提问
发表于 : 2018-06-04 14:59
之前一直使用fifo的方法来实现shell里面的多线程功能,眼下想到使用parallel来简单实现这个并行的目标。然而实际测试之后的效果不怎么样。如此,记录一下实验结果。
首先,
for num in {1..100}
do
echo $num >>num_parallel
done
然后,我们写个正常的for脚本,time测试一下速度
time for n in `cat num_parallel`
do
echo $n
done
速度返回如下:
real 0m0.031s
user 0m0.020s
sys 0m0.000s
然后,我们让他并行执行,time测速
time for n in `cat num_parallel`
do
echo $n &
wait
done
速度返回如下:
real 0m0.652s
user 0m0.030s
sys 0m0.230s
很奇怪,并行之后反而执行的慢了。
然后我们用parallel写一个并行的脚本,实际测试之后发现速度更慢了。
time cat num_parallel | parallel echo
速度返回:
real 0m4.172s
user 0m2.260s
sys 0m2.030s
这个应该说很慢了,但是我很快发现了一个竟然还能更慢的写法,下面是代码:
time for num in `cat num_parallel`
do
parallel -j3 echo ::: $num
done
速度返回:
real 2m8.302s
user 1m41.450s
sys 0m19.730s
经过实际的测试,发现正常执行速度最快,然后是shell内嵌的并行速度相对慢些,最慢的是parallel并行的速度。
然而,眼下我需要写的脚本执行的速度比较慢到不是很重要,重要的是网速。哈,那么你们谁看看这个脚本应该如何并行化。我希望使用的是parallel工具,因为写起来比较方便。
–-------------------------------------分割线-----------------------------------------
#!/bin/bash
read -p "files: " files
read -p "source: " source
read -p "destation: " destation
for r in `seq 1 $files`
do
for i in {1..10}
do
echo $r files
echo $i times
~/Desktop/you-get/you-get `sed -n "$r"p "$source"`
if [ $? == 0 ]
then
find -size +100M -exec mv {} "$destation" \; &
break
fi
done
done
–-------------------------------------分割线-----------------------------------------
我写出了这个脚本,但是显然遇到了新的问题,就是并行化之后需要把应用正确关闭的文件转移走,正确关闭的文件就是下载成功的,不然就是下载失败的。
脚本:
for f in `cat urls`
do
parallel -j5 { for t in {1..10}
do
~/Desktop/you-get/you-get ::: $f
if [ $? == 0 ]
then
find -size +100M -exec mv {} “dest” \; &
break
fi
done}
done
哪个高手看看,如何把
find -size +100M -exec mv {} “dest” \; &
这行改写成you-get正确关闭的文件转移,而不是按照体积转移。
另外,我不知道为什么使用parallel的速度会如此慢,按说应该更快才对,谁懂这个是怎么回事,回复一下。
谢谢大家!
首先,
for num in {1..100}
do
echo $num >>num_parallel
done
然后,我们写个正常的for脚本,time测试一下速度
time for n in `cat num_parallel`
do
echo $n
done
速度返回如下:
real 0m0.031s
user 0m0.020s
sys 0m0.000s
然后,我们让他并行执行,time测速
time for n in `cat num_parallel`
do
echo $n &
wait
done
速度返回如下:
real 0m0.652s
user 0m0.030s
sys 0m0.230s
很奇怪,并行之后反而执行的慢了。
然后我们用parallel写一个并行的脚本,实际测试之后发现速度更慢了。
time cat num_parallel | parallel echo
速度返回:
real 0m4.172s
user 0m2.260s
sys 0m2.030s
这个应该说很慢了,但是我很快发现了一个竟然还能更慢的写法,下面是代码:
time for num in `cat num_parallel`
do
parallel -j3 echo ::: $num
done
速度返回:
real 2m8.302s
user 1m41.450s
sys 0m19.730s
经过实际的测试,发现正常执行速度最快,然后是shell内嵌的并行速度相对慢些,最慢的是parallel并行的速度。
然而,眼下我需要写的脚本执行的速度比较慢到不是很重要,重要的是网速。哈,那么你们谁看看这个脚本应该如何并行化。我希望使用的是parallel工具,因为写起来比较方便。
–-------------------------------------分割线-----------------------------------------
#!/bin/bash
read -p "files: " files
read -p "source: " source
read -p "destation: " destation
for r in `seq 1 $files`
do
for i in {1..10}
do
echo $r files
echo $i times
~/Desktop/you-get/you-get `sed -n "$r"p "$source"`
if [ $? == 0 ]
then
find -size +100M -exec mv {} "$destation" \; &
break
fi
done
done
–-------------------------------------分割线-----------------------------------------
我写出了这个脚本,但是显然遇到了新的问题,就是并行化之后需要把应用正确关闭的文件转移走,正确关闭的文件就是下载成功的,不然就是下载失败的。
脚本:
for f in `cat urls`
do
parallel -j5 { for t in {1..10}
do
~/Desktop/you-get/you-get ::: $f
if [ $? == 0 ]
then
find -size +100M -exec mv {} “dest” \; &
break
fi
done}
done
哪个高手看看,如何把
find -size +100M -exec mv {} “dest” \; &
这行改写成you-get正确关闭的文件转移,而不是按照体积转移。
另外,我不知道为什么使用parallel的速度会如此慢,按说应该更快才对,谁懂这个是怎么回事,回复一下。
谢谢大家!