使用parallel并行shell for语句的研究和提问

sh/bash/dash/ksh/zsh等Shell脚本
回复
yubinalice
帖子: 197
注册时间: 2015-12-23 16:20
系统: ubuntu 16.04

使用parallel并行shell for语句的研究和提问

#1

帖子 yubinalice » 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的速度会如此慢,按说应该更快才对,谁懂这个是怎么回事,回复一下。

谢谢大家!
头像
lilydjwg
论坛版主
帖子: 4248
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 使用parallel并行shell for语句的研究和提问

#2

帖子 lilydjwg » 2018-06-12 13:55

粗略看了一下,结论是:你不会用 parallel,或者不理解 shell 脚本与 parallel 的关系,或者两者都有。

第一例使用 parallel 慢的原因,是因为 parallel 本身是 perl 脚本,启动需要时间,分配、执行任务也需要时间。所以 parallel 适合比较慢的、耗 CPU 的命令,而不适合本身就很快的小命令。

第二例慢的原因是因为并没有并行。每一个 parallel 完成之后才会执行下一个 parallel 命令。你需要使用 sem 这个命令来提交任务。
回复