linux shell 多线程执行程序

简介: Shell中并没有真正意义的多线程,要实现多线程可以启动多个后端进程,最大程度利用cpu性能。直接看代码示例吧。(1) 顺序执行的代码 1 #!/bin/bash 2 date 3 for i in `seq 1 5` 4 do 5 { 6 echo "sleep 5" ...

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 done
10 date 

输出:

Sat Nov 19 09:21:51 CST 2016
sleep 5
sleep 5
sleep 5
sleep 5
sleep 5
Sat 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 done
10 wait  ##等待所有子后台进程结束
11 date

输出:

Sat Nov 19 09:25:07 CST 2016
sleep 5
sleep 5
sleep 5
sleep 5
sleep 5
Sat 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++));do
20     echo
21 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_cmd
31     } &
32 
33     echo >&6 # 当进程结束以后,再向fd6中加上一个回车符,即补上了read -u6减去的那个
34 done
35 
36 wait
37 exec 6>&- # 关闭fd6
38 echo "over"

 

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

 

相关文章
|
1天前
|
存储 移动开发 Linux
Linux系统之部署h5ai目录列表程序
【5月更文挑战第3天】Linux系统之部署h5ai目录列表程序
12 1
|
1天前
|
Linux Shell 程序员
【Linux】权限(shell运行原理、概念,Linux权限)
【Linux】权限(shell运行原理、概念,Linux权限)
6 2
|
1天前
|
存储 运维 Java
Linux笔记02 —— Shell补充
Linux笔记02 —— Shell补充
22 2
|
1天前
|
安全 Linux Shell
Linux笔记01 —— Linux初识与Shell汇总(请配合另一篇《Linux笔记02》一起使用)
Linux笔记01 —— Linux初识与Shell汇总(请配合另一篇《Linux笔记02》一起使用)
9 1
|
1天前
|
Shell Linux 编译器
C语言,Linux,静态库编写方法,makefile与shell脚本的关系。
总结:C语言在Linux上编写静态库时,通常会使用Makefile来管理编译和链接过程,以及Shell脚本来自动化构建任务。Makefile包含了编译规则和链接信息,而Shell脚本可以调用Makefile以及其他构建工具来构建项目。这种组合可以大大简化编译和构建过程,使代码更易于维护和分发。
9 3
|
13天前
|
监控 网络协议 数据可视化
Shell脚本查看linux系统性能瓶颈
Shell脚本查看linux系统性能瓶颈
|
14天前
|
存储 缓存 Java
【linux线程(四)】初识线程池&手撕线程池
【linux线程(四)】初识线程池&手撕线程池
|
14天前
|
Java Linux
【linux线程(三)】生产者消费者模型详解(多版本)
【linux线程(三)】生产者消费者模型详解(多版本)
|
14天前
|
安全 Linux 调度
【linux线程(二)】线程互斥与线程同步
【linux线程(二)】线程互斥与线程同步
|
14天前
|
Linux 调度
【linux线程(一)】什么是线程?怎样操作线程?
【linux线程(一)】什么是线程?怎样操作线程?