之前一直使用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的速度会如此慢,按说应该更快才对,谁懂这个是怎么回事,回复一下。
谢谢大家!
使用parallel并行shell for语句的研究和提问
-
- 帖子: 197
- 注册时间: 2015-12-23 16:20
- 系统: ubuntu 16.04
- lilydjwg
- 论坛版主
- 帖子: 4249
- 注册时间: 2009-04-11 23:46
- 系统: Arch Linux
- 联系:
Re: 使用parallel并行shell for语句的研究和提问
粗略看了一下,结论是:你不会用 parallel,或者不理解 shell 脚本与 parallel 的关系,或者两者都有。
第一例使用 parallel 慢的原因,是因为 parallel 本身是 perl 脚本,启动需要时间,分配、执行任务也需要时间。所以 parallel 适合比较慢的、耗 CPU 的命令,而不适合本身就很快的小命令。
第二例慢的原因是因为并没有并行。每一个 parallel 完成之后才会执行下一个 parallel 命令。你需要使用 sem 这个命令来提交任务。
第一例使用 parallel 慢的原因,是因为 parallel 本身是 perl 脚本,启动需要时间,分配、执行任务也需要时间。所以 parallel 适合比较慢的、耗 CPU 的命令,而不适合本身就很快的小命令。
第二例慢的原因是因为并没有并行。每一个 parallel 完成之后才会执行下一个 parallel 命令。你需要使用 sem 这个命令来提交任务。