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 ...
随机推荐
- 删CentOS / RHEL库和配置文件(Repositories and configuraiton files)
1 删除库简介 随着root权限执行以下的命令: # cd /etc/yum.repos.d/ 列出全部库(repo) #ls CentOS-Base.repo epel.repo mirrors-r ...
- [LeetCode235]Lowest Common Ancestor of a Binary Search Tree
题目: Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in th ...
- configure.ac:20: error: Autoconf version 2.65 or higher is required
安装thrift例如,下面的问题出现: configure.ac:20: error: Autoconf version 2.65 or higher is required wget http:// ...
- iOS_17_控制开关_TabBarController_由storyboard道路
最后效果图: main.storyboard BeyondViewController.m中有一句关键代码,设置tabbarItem图片的样式(30*30) // // BeyondViewContr ...
- HDU 3831 DICS
意甲冠军: 按标题给4操作模式 用最少的次数 离a串行转换b弦 思路: 因为操作仅仅有这4种 所以我们能够确定从头到位去匹配a和b一定是正确的 那么状态数一共同拥有多少呢 一共同拥有lengt ...
- 关于“类不能支持Automation操作”错误的解决方法
一段程序IE上老是提示“类不支持Automation操作”的错误,IE6.7.8都一样,但是Firefox可以,后来网上找到如下解决方法: 重新注册下以下文件,问题便解决了:msscript.ocxd ...
- Socket方法LAN多线程文件传输
1.思维:为了实现各种文件的大小可以被发送和接收的,它可以被设置为发送和接收缓冲器环.并记录文件的位置读取,假设读入缓冲区的字节的特定数目大于缓冲区的大小较小.然后该文件被发送,退出发送周期,关闭连接 ...
- Linux-2.6.32内核编译流量计数器nfacct
最近一直想看到一本书<一个Jiegeng华>.而技术不依赖书.但是,这并不表示我IT技术没有兴趣.事实证明,,当我无法理解的沧桑.肮脏的领导者无法理解的心理.自我可惜无法理解它处处感受到脏 ...
- Nginx + IIS
Nginx + IIS 配置,实现负载均衡 当你的Web应用程序访问量大的时候,一台服务器可能会因为压力过大而无法处理所有的请求.此时,可以增加服务器,采用负载均衡来分担所有的请求.关于Nginx ...
- error while loading shared libraries: libpthread.so.0: cannot open shared object file: No such file
安装rac10g,出现例如以下错误: [root@rac2 oracle]# /u01/product/crs/root.sh WARNING: directory '/u01/product' is ...