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 ...
随机推荐
- mybaits使用存储过程
如何使用Mybaits调用数据库存储过程,按以下顺序Oracle案例库: 1.在数据库中创建以下存储过程: create or replace procedure pro_hello(p_result ...
- TFS(Team Foundation Server)简介和新手入门
在两部分的文章.我会介绍Team Foundation Server一些核心功能,着重于产品的日常应用是如何将这些功能结合使用. 作为一个软件开发.在我的职业生涯,.我常常用于支持软件开发过程中大量的 ...
- air mobile andriod ios 页面加载控件
通过最近的研究flex 书写android .ios申请书,我们遇到了一个问题加载页面,我们用flex sdk 12,air 15 无级似android ListView寻呼模块.所以,我和我的同事们 ...
- Mybatis深入之事务管理
Mybatis之事务管理 简单介绍 Mybatis的事务管理分为两种JdbcTransaction.ManagedTransaction. 当中JdbcTransaction仅仅是对数据库连接Conn ...
- Lua中的weak表——weak table(转)
弱表(weak table)是一个很有意思的东西,像C++/Java等语言是没有的.弱表的定义是:A weak table is a table whose elements are weak ref ...
- Apple Watch 1.0 开发介绍 1.4 简介 使用iOS技术
WatchKit extension可以使用iOS app同样的技术,但是由于他是extension,使用有些技术的时候会有限制,有些不推荐使用.下面是一些介绍以及什么时候使用什么技术: 有些需要权限 ...
- PDO基本操作Mysql
来源:PHP开发学习门户 地址:http://www.phpthinking.com/archives/805 PHP中的PDO扩展为PHP訪问数据库定义了一个轻量级的.一致性的接口.它提供了一个数据 ...
- CF 444B(DZY Loves FFT-时间复杂度)
B. DZY Loves FFT time limit per test 1 second memory limit per test 256 megabytes input standard inp ...
- Appium之java API
AppiumDriver getAppStrings() 默认系统语言相应的Strings.xml文件内的数据. driver.getAppStrings(String language) 查找某一个 ...
- [WebView其中一项研究]:Web Apps基本介绍
今天,我们开始了解WebView,以及Web Apps发展,从主要内容Android实际的例子来解释正式文件和后续. (博客地址:http://blog.csdn.net/developer_jian ...