linux shell 多线程执行程序

发布时间:2017-3-24 8:13:41 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"linux shell 多线程执行程序 ",主要涉及到linux shell 多线程执行程序 方面的内容,对于linux shell 多线程执行程序 感兴趣的同学可以参考一下。

Shell中并没有真正意义的多线程,要实现多线程可以启动多个后端进程,最大程度利用cpu性能。

直接看代码示例吧。

(1) 顺序执行的代码

 1 #!/bin/bash 2 date 3 for i in `seq 1 5` 4 do 5 { 6     echo "sleep 5" 7     sleep 5 8 } 9 done10 date 

输出:

Sat Nov 19 09:21:51 CST 2016sleep 5sleep 5sleep 5sleep 5sleep 5Sat Nov 19 09:22:16 CST 2016

(2) 并行代码

使用'&'+wait 实现“多进程”实现

 1 #!/bin/bash 2 date 3 for i in `seq 1 5` 4 do 5 { 6     echo "sleep 5" 7     sleep 5 8 } & 9 done10 wait  ##等待所有子后台进程结束11 date

输出:

Sat Nov 19 09:25:07 CST 2016sleep 5sleep 5sleep 5sleep 5sleep 5Sat Nov 19 09:25:12 CST 2016

 (3) 对于大量处理任务如何实现启动后台进程的数量可控?

  简单的方法可以使用2层for/while循环实现,每次wait内层循环的多个后台程序执行完成

  但是这种方式的问题是,如果内层循环有“慢节点”可能导致整个任务的执行执行时间长。

  更高级的实现可以看(4)

(4) 使用命名管道(fifo)实现每次启动后台进程数量可控。 

 1 #!/bin/bash 2  3 function my_cmd(){ 4     t=$RANDOM 5     t=$[t%15] 6     sleep $t 7     echo "sleep $t s" 8 } 9 10 tmp_fifofile="/tmp/$$.fifo" 11 mkfifo $tmp_fifofile      # 新建一个fifo类型的文件12 exec 6<>$tmp_fifofile     # 将fd6指向fifo类型13 rm $tmp_fifofile    #删也可以14 15 thread_num=5  # 最大可同时执行线程数量16 job_num=100   # 任务总数17 18 #根据线程总数量设置令牌个数19 for ((i=0;i<${thread_num};i++));do20     echo21 done >&6 22 23 for ((i=0;i<${job_num};i++));do # 任务数量24     # 一个read -u6命令执行一次,就从fd6中减去一个回车符,然后向下执行,25     # fd6中没有回车符的时候,就停在这了,从而实现了线程数量控制26     read -u6 27 28     #可以把具体的需要执行的命令封装成一个函数29     {   30         my_cmd31     } &32 33     echo >&6 # 当进程结束以后,再向fd6中加上一个回车符,即补上了read -u6减去的那个34 done35 36 wait37 exec 6>&- # 关闭fd638 echo "over"

参考:http://lawrence-zxc.github.io/2012/06/16/shell-thread/

上一篇:MySQL 可以用localhost 连接,但不能用IP连接的问题
下一篇:LIGO找到首个超越广义相对论的证据?

相关文章

相关评论

本站评论功能暂时取消,后续此功能例行通知。

一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!

二、互相尊重,对自己的言论和行为负责。

好贷网好贷款