shell 中用管道模拟多线程
shell 中用管道模拟多线程
这里以两个例子来对比多线程和单进程
单线程的例子
# config.txt在这个例子和多线程的例子中都会用到
[root@ns_10.2.1.242 test]$ cat config.txt
1
2
3
4
1
2
3
4
# 下面的代码,是从config.txt中读取配置,然后sleep一定时间,然后打印sleep 的时间长度,
# 注意 while从文本读取数据,是逐行读取的
[root@ns_10.2.1.242 test]$ cat while.sh
while read line
do
sleep $line && echo "$line success"
done < config.txt
# 这个脚本,消耗了20秒,结果如下:
[root@ns_10.2.1.242 test]$ time sh while.sh
1 success
2 success
3 success
4 success
1 success
2 success
3 success
4 success
real 0m20.011s
user 0m0.000s
sys 0m0.004s
多线程的例子:
# config.txt在这个例子和多线程的例子中都会用到
[root@ns_10.2.1.242 test]$ cat config.txt
1
2
3
4
1
2
3
4
# 多线程的代码,如下
[root@ns_10.2.1.242 test]$ cat p3.sh
#!bash
# 2014-12-5
# --------------------
# 此例子说明了一种用wait、read命令模拟多线程的一种技巧
# 此技巧往往用于多主机检查,比如ssh登录、ping等等这种单进程比较慢而不耗费cpu的情况
# -------------------------
operation(){
sleep $1
}
tmp_fifofile=/tmp/$$.fifo
#echo $tmp_fifofile
mkfifo $tmp_fifofile # 新建一个fifo的管道文件
exec 6<>$tmp_fifofile # 绑定fd6
rm $tmp_fifofile
# 这里是向管道添加了$thread个空行
THREAD=3 # 线程数,可以改变
for i in $(seq 0 $THREAD);do
echo
done >&6
CONFIG_FILE=config.txt
# 修改这个脚本到生成环境,主要是修改operation和CONFIG_FILE配置
# 每次读取一行数据
while read line
do
# 一个read -u6命令执行一次,就从fd6中减去一个回车符,然后向下执行,
# fd6 中没有回车符的时候,就停在这了,从而实现了线程数量控制
read -u6
{
# 操作成功,记录到成功日志,修改echo
# 操作失败,记录到错误日志
operation $line && echo " $line success" || echo "$line error"
# 当进程结束以后,再向fd6中加上一个回车符,即补上了read -u6减去的那个
echo >&6
} & # 后台执行,这里的 &是非常重要的,同时有$THREAD个后台进程
done < ${CONFIG_FILE}
wait # 等待所有的后台子进程结束
exec 6>&- # 关闭df6
exit 0
# 脚本的结果,执行了7秒
[root@ns_10.2.1.242 test]$ time sh p3.sh
1 success
2 success
1 success
3 success
4 success
2 success
3 success
4 success
real 0m7.007s
user 0m0.000s
sys 0m0.003s
[root@ns_10.2.1.242 test]$
另外一个 命名管道基础的文章
多进程脚本中需要注意的知识点,有3个
while读取文件
while read line
do
echo $line
done < config.txt
管道的绑定, exec 6<>$tmp_fifofile 和 向管道写数据 echo >&6
[root@ns_10.2.1.242 test]$ mkfifo testfifo
[root@ns_10.2.1.242 test]$ exec 6<>testfifo
[root@ns_10.2.1.242 test]$ echo 1 >&6
[root@ns_10.2.1.242 test]$ cat testfifo
1
#注意,进程会卡死的 # 没有& 符号,是创建了文件名为6的文件,然后把1 输出问文件名为6的文件
[root@ns_10.2.1.242 test]$ echo 1 >6
[root@ns_10.2.1.242 test]$ cat 6
1
[root@ns_10.2.1.242 test]$ ls -alh 6
-rw-r--r--. 1 root root 2 Jan 22 20:26 6
read -u6
read
-u Read input from file descriptor fd(从文件描述符读取输入) read 读取一行,向管道写n行,就可以读取n次,n+1会堵塞
[root@ns_10.2.1.242 test]$ mkfifo testfifo
[root@ns_10.2.1.242 test]$ exec 6<>testfifo
[root@ns_10.2.1.242 test]$ echo 1 >&6
[root@ns_10.2.1.242 test]$ echo 1 >&6
[root@ns_10.2.1.242 test]$ echo 1 >&6
[root@ns_10.2.1.242 test]$ read -u6
[root@ns_10.2.1.242 test]$ read -u6
[root@ns_10.2.1.242 test]$ read -u6
注意:
多线程脚本应用在真实环境的时候,只需要修改CONFIG_FILE和operation函数
THREAD控制线程数量
shell 中用管道模拟多线程的更多相关文章
- shell模拟“多线程”
shell中并没有真正意义上的多线程,要实现"多线程"可以启动多个子进程,并将子进程放入后台执行来模拟多线程,最大程度利用CPU性能. 循环中执行并行代码 #!/bin/bas ...
- Linux下模拟多线程的并发并发shell脚本
分享一个在Linux下模拟多线程的并发脚本,使用这个脚本可以同时批量在定义数量的服务器上执行相关命令,比起普通for/while循环只能顺序一条一条执行的效率高非常多,在管理大批服务器时非常的实用. ...
- php模拟多线程
一:应该知道的: php本身是不支持多线, 但是php的好搭档,apache和linux是支持的,故lamp才是最佳组合,还在使用win服务器的现在知道为什么要用linux吧.既然是模拟的, 就不是真 ...
- php使用curl模拟多线程发送请求
每个PHP文件的执行是单线程的,但是php本身也可以用一些别的技术实现多线程并发比如用php-fpm进程,这里用curl模拟多线程发送请求.php的curl多线程是通过不断调用curl_multi_e ...
- 利用curl 模拟多线程
所谓多线程就是多个 程序同时运行,单线程:执行一段逻辑,等待完成后 在执行另外一个. 多线程:几个逻辑同时进行处理,不需要相互等待,提高了总的执行时间 接下来就用curl实现多线程 实现逻辑 1. f ...
- 通过curl模拟多线程抓取网页(curl_multi_*)
curl请求多个url,以前都是使用循环来处理.最近发现可以通过curl_multi_*系列函数来模拟多线程.比对一下,发现如果请求的url只有几个,2种方案耗时差不多,但是url比较多,差距就非常明 ...
- Linux Shell中管道的原理及C实现框架
在shell中我们经常用到管道,有没考虑过Shell是怎么实现管道的呢? cat minicom.log | grep "error" 标准输入.标准输出与管道 我们知道,每一个进 ...
- C# WPF 中用代码模拟鼠标和键盘的操作
原文:C# WPF 中用代码模拟鼠标和键盘的操作 原文地址 C#开发者都知道,在Winform开发中,SendKeys类提供的方法是很实用的.但是可惜的是,在WPF中不能使用这个方法了. 我们知道,在 ...
- 【JavaScript】吃饱了撑的系列之JavaScript模拟多线程并发
前言 最近,明学是一个火热的话题,而我,却也想当那么一回明学家,那就是,把JavaScript和多线程并发这两个八竿子打不找的东西,给硬凑了起来,还写了一个并发库concurrent-thread-j ...
随机推荐
- Spring4.0MVC学习资料,ApplicationContext中的方法具体解释(三)
做为java开源的一部分,spring框架一直排在老大的位置.Spring4.0 是 Spring 推出的一个重大版本号升级,进一步加强了 Spring 作为 Java 领域第一开源平台的地位.Spr ...
- App设计相关网站
http://sketch.im/ 设计素材 principle 动效软件 http://principleformac.com/ 官网 http://principlecn.com/ 中文网
- maven插件的生命周期的详细说明(两)
插件配置 定义解释:插件目标 当我们了解了maven插件之后.我们发现假设为每个功能编写一个独立的插件显然是不可取的,由于这些任务背后有非常多能够复用的代码.因此,把这些功能聚集在一个插件里,每个功能 ...
- 深入研究Java类载入机制
深入研究Java类载入机制 类载入是Java程序运行的第一步,研究类的载入有助于了解JVM运行过程,并指导开发人员採取更有效的措施配合程序运行. 研究类载入机制的第二个目的是让程序能动态的控制类载 ...
- 马云收购UC你,至于到底是谁宣战
近日,阿里巴巴官方正式宣布,UC优视全资融入阿里巴巴集团,并组建阿里UC移动事业群. 据阿里方面表示,整个交易对UC的估值远超百度对91无线的估值,外界推測估值近50美元.是中国互联网最大一笔交易.业 ...
- jQuery Mobile发展新闻阅读器,适应iphone和android打电话
程序猿是很不赖,你知道. 我们经常新浪,腾讯.雅虎等各大网站看到上述新闻.他们还推出了自己的移动新闻阅读器.今天,我自己用的jQuery Mobile 为了实现这一功能,.图像大小上传限制的大小250 ...
- 达到HTTP合约Get、Post和文件上传功能——采用WinHttp介面
于<采用WinHttp实现HTTP协议Get.Post和文件上传功能>一文中,我已经比較具体地解说了怎样使用WinHttp接口实现各种协议. 在近期的代码梳理中,我认为Post和文件上传模 ...
- Nginx + IIS 配置,实现负载均衡
当你的Web应用程序访问量大的时候,一台服务器可能会因为压力过大而无法处理所有的请求.此时,可以增加服务器,采用负载均衡来分担所有的请求.关于Nginx的作用,自行百度了解.总之,在Windows平台 ...
- Atitit。团队建设--管理最佳实践--如何留住关键人才,防止人才外流 ??
Atitit.团队建设--管理最佳实践--怎样留住核心人才,防止人才流失 ?? 1. 1.人才流失后果 1 1. 1.员工的离职带走商业技术秘密和客户等资源 1 2. 2.影响在职员工的情绪.极大挫伤 ...
- lsblk请参阅块设备
lsblk可以查看分区和挂载的磁盘使用情况 lsblk全部的參数 -a, --all 显示全部设备 -b, --bytes 以bytes方式显示设备大小 - ...