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/

 

相关文章
|
3月前
|
Shell Linux
Linux shell编程学习笔记30:打造彩色的选项菜单
Linux shell编程学习笔记30:打造彩色的选项菜单
|
2月前
|
Java 开发者
如何通过易语言多线程提升程序响应速度
如何通过易语言多线程提升程序响应速度
155 62
|
2月前
|
Web App开发 网络协议 Linux
linux命令总结(centos):shell常用命令汇总,平时用不到,用到就懵逼忘了,于是专门写了这篇论文,【便持续更新】
这篇文章是关于Linux命令的总结,涵盖了从基础操作到网络配置等多个方面的命令及其使用方法。
70 1
linux命令总结(centos):shell常用命令汇总,平时用不到,用到就懵逼忘了,于是专门写了这篇论文,【便持续更新】
|
1月前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
2月前
|
Java 开发者
如何通过易语言多线程提升程序响应速度?
如何通过易语言多线程提升程序响应速度?
|
2月前
|
资源调度 Linux 调度
Linux C/C++之线程基础
这篇文章详细介绍了Linux下C/C++线程的基本概念、创建和管理线程的方法,以及线程同步的各种机制,并通过实例代码展示了线程同步技术的应用。
31 0
Linux C/C++之线程基础
|
3月前
|
Shell Linux
Linux shell编程学习笔记82:w命令——一览无余
Linux shell编程学习笔记82:w命令——一览无余
|
2月前
|
监控 Java API
|
2月前
|
存储 Shell Linux
【Linux】shell基础,shell脚本
Shell脚本是Linux系统管理和自动化任务的重要工具,掌握其基础及进阶用法能显著提升工作效率。从简单的命令序列到复杂的逻辑控制和功能封装,Shell脚本展现了强大的灵活性和实用性。不断实践和探索,将使您更加熟练地运用Shell脚本解决各种实际问题
32 0
|
2月前
|
安全 Linux
Linux线程(十一)线程互斥锁-条件变量详解
Linux线程(十一)线程互斥锁-条件变量详解