当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 2 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 使用parallel并行shell for语句的研究和提问
帖子发表于 : 2018-06-04 14:59 

注册: 2015-12-23 16:20
帖子: 110
系统: ubuntu 16.04
送出感谢: 1
接收感谢: 0 次
之前一直使用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的速度会如此慢,按说应该更快才对,谁懂这个是怎么回事,回复一下。

谢谢大家!


页首
 用户资料  
 
2 楼 
 文章标题 : Re: 使用parallel并行shell for语句的研究和提问
帖子发表于 : 2018-06-12 13:55 
头像

注册: 2009-04-11 23:46
帖子: 4164
系统: Arch Linux
送出感谢: 11
接收感谢: 127
粗略看了一下,结论是:你不会用 parallel,或者不理解 shell 脚本与 parallel 的关系,或者两者都有。

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

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


_________________
我的博客 https://blog.lilydjwg.me/
提问的智慧 害人的 X-Y 问题
Arch Linux 中文论坛

我的vimrc: https://git.io/vimrc


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 2 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 5 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译