zoukankan      html  css  js  c++  java
  • 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 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/

  • 相关阅读:
    LeetCode38 报数
    序列化和反序列化
    JAVA 正则表达式
    Comparable接口和Comparator接口
    IO流-输入输出的简单实例
    JAVA File类
    URI, URL, URN
    web自动化测试第2步:定位元素
    web自动化测试第1步:配置基于python语言的自动化测试环境
    使用webdriver扒取网站小说(一)-----基础篇
  • 原文地址:https://www.cnblogs.com/xudong-bupt/p/6079849.html
Copyright © 2011-2022 走看看