成功最有效的方法就是向有经验的人学习!

linux shell 多线程执行程序

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

直接看代码示例吧。

(1) 顺序执行的代码

#!/bin/bash
date
for i in `seq 1 5`
do
{
    echo "sleep 5"
    sleep 5
}
done
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 实现“多进程”实现

#!/bin/bash
date
for i in `seq 1 5`
do
{
    echo "sleep 5"
    sleep 5
} &
done
wait  ##等待所有子后台进程结束
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)实现每次启动后台进程数量可控。

#!/bin/bash

function my_cmd(){
    t=$RANDOM
    t=$[t%15]
    sleep $t
    echo "sleep $t s"
}

tmp_fifofile="/tmp/$$.fifo" 
mkfifo $tmp_fifofile      # 新建一个fifo类型的文件
exec 6<>$tmp_fifofile     # 将fd6指向fifo类型
rm $tmp_fifofile    #删也可以

thread_num=5  # 最大可同时执行线程数量
job_num=100   # 任务总数

#根据线程总数量设置令牌个数
for ((i=0;i<${thread_num};i++));do
    echo
done >&6 

for ((i=0;i<${job_num};i++));do # 任务数量
    # 一个read -u6命令执行一次,就从fd6中减去一个回车符,然后向下执行,
    # fd6中没有回车符的时候,就停在这了,从而实现了线程数量控制
    read -u6 

    #可以把具体的需要执行的命令封装成一个函数
    {   
        my_cmd
    } &

    echo >&6 # 当进程结束以后,再向fd6中加上一个回车符,即补上了read -u6减去的那个
done

wait
exec 6>&- # 关闭fd6
echo "over"
赞(0) 打赏
未经允许不得转载:陈桂林博客 » linux shell 多线程执行程序
分享到

大佬们的评论 抢沙发

全新“一站式”建站,高质量、高售后的一条龙服务

微信 抖音 支付宝 百度 头条 快手全平台打通信息流

橙子建站.极速智能建站8折购买虚拟主机

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫打赏

微信扫一扫打赏

登录

找回密码

注册