首页 > 代码库 > shell多线程
shell多线程
关于shell的多线程
1. 多线程并发执行任务,而不用一台台的串行执行,能更快更高效
2. Shell并没有多线程的概念,所以:
* 一般使用wait、read等命令技巧性地模拟多线程实
* 使用命名管道(fifo)来实现多线程的控制
3. 用途:需要对多主机批量执行检查或操作时(例如ssh、ping等操作)
分段解析一个例子来理解一个多线程脚本的书写
1. 新建fifo类型文件
tmp_fifofile="/tmp/$$.fifo"mkfifo $tmp_fifofile #新建fifo类型的文件exec 5<>$tmp_fifofile #将fd 5指向fifo类型rm $tmp_fifofile #可删除 #这里的$$.fifo/5都是一个文件名而已,可随意
2. 定义线程数,循环键入字符,通过字符控制实现线程数量控制
thread=5 # $thread 定义的是线程数,thread=5的意思是每次最多同时执行5个线程#写一个for循环随便echo个字符在5这个文件中,实际上我们就是通过对这个字符的数量控制来实现对线程数量的控制的for ((i=0;i<$thread;i++)) do echo done >&5
3. 执行任务
# read -u <fd>命令的意义是:read input from file descriptor fd. 读取来自文件描述符fd的输入# 实际上我们是通过“read -u 5”来实现每次从5中减去一个字符,job_num=20 # $job_num定义了总的任务数for ((i=0;i<$job_num;i++))doread -u5 { sleep 3 && echo "Hello World" || echo "Hello error" ...... ===>这些部分就是我们要执行的命令,可封装成函数 ...... echo >&5 #多加回一个字符}&done
4. 等待、关闭、退出
wait #等待所有子进程结束exec 5>&- #关闭fd 5exit 0 #成功退出
5. 执行结果
我们的job_num有20个,thread定义了5个即每5个每5个这样执行一共需要执行4次(单线程就要执行20次了)每次执行是3s,所以共花费3*4=12s# time sh dxc.sh Hello WorldHello WorldHello WorldHello WorldHello WorldHello WorldHello WorldHello WorldHello WorldHello WorldHello WorldHello WorldHello WorldHello WorldHello WorldHello WorldHello WorldHello WorldHello WorldHello Worldreal 0m12.064suser 0m0.020ssys 0m0.042s
shell多线程
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。