shell实现队列控制并发执行脚本

本文介绍了一种通过创建文件描述符和有名管道实现的并行Shell脚本优化方法,该方法利用队列特性控制并发任务,显著提升了处理大量文件时的效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在工作中,个人需要用到统计数据的脚本,比如对批量文件过滤关键字进行统计等等,这种需求很常见。默认的shell脚本是串行的,当有大量文件的时候,要进行循环一个个的过滤出来,这个过程需要比较久,效率也比较低。通过查找资料,对脚本进行调整,实现并发执行,具体如下:

#!/bin/bash
date

DIR=/test/log/

FILE_NAME=65535_`date +"%Y%m%d"`;
FILE_NAME_LAST_DAY=`date -d "yesterday" +"%Y%m%d"`;

time_of_system=`date +"%Y-%m-%d"`

function multi_processor(){
    [ -e /tmp/fd1 ] || mkfifo /tmp/fd1    #创建有名管道
    exec 3<>/tmp/fd1    #创建文件描述符,以可读(<)可写(>)的方式关联管道文件,这时候文件描述符3就有了有名管道文件的所有特性       
    rm -rf /tmp/fd1    #关联后的文件描述符拥有管道文件的所有特性,所以这时候管道文件可以删除,我们留下文件描述符来用就可以了
    for ((i=1;i<=30;i++))    #30这个具体可以根据系统的cpu核数来调整
    do
        echo >&3     #&3代表引用文件描述符3,这条命令代表往管道里面放入了一个"令牌"
    done

    for file in $1
    do
    read -u3    #代表从管道中读取一个令牌
    {
        grep $3 $file | awk -F"|" '{print $7}' | sort | uniq >> $2;    #具体的批量过滤逻辑
        echo >&3    #代表我这一次命令执行到最后,把令牌放回管道
    }&
    done
    wait

    exec 3<&-    #关闭文件描述符的读
    exec 3>&-    #关闭文件描述符的写
}

#register 1 day ago
register_file=register_file_1_day_ago_$HOSTNAME.txt
file_modify_time=`stat $register_file | grep Modify | awk '{print $2}'`
files_last_day=`find $DIR -type f -name "$FILE_NAME_LAST_DAY*"`
if [[ $file_modify_time != $time_of_system ]]; then
    echo "$register_file file_modify_time(${file_modify_time}) time_of_system(${time_of_system})"
    rm $register_file
    multi_processor "$files_last_day" "$register_file" "REGISTER"
fi

代码解析以及问题:

1.管道具有存一个读一个,读完一个就少一个,没有则阻塞,放回的可以重复取,这正是队列特性,但是问题是当往管道文件里面放入一段内容,没人取则会阻塞,这样你永远也没办法往管道里面同时放入10段内容(想当与10把药匙),解决这个问题的关键就是文件描述符了。

2.mkfifo /tmp/fd1 
创建有名管道文件exec 3<>/tmp/fd1,创建文件描述符3关联管道文件,这时候3这个文件描述符就拥有了管道的所有特性,还具有一个管道不具有的特性:无限存不阻塞,无限取不阻塞,而不用关心管道内是否为空,也不用关心是否有内容写入引用文件描述符: &3可以执行n次echo >&3 往管道里放入n把钥匙

3.两个for循环,第一个for循环10次,相当于在女士公共厕所门口放了10把钥匙,第二个for循环1000次,相当于1000个人来厕所,read -u3相当于取走一把药匙,{}里面最后一行代码echo >&3相当于上完厕所送还药匙。

4.这样就实现了10把药匙控制1000个任务的运行,运行时间为101s,肯定不如方案二快,但是比方案一已经快很多了,这就是队列控制同一时间只有最多10个线程的并发,既提高了效率,又实现了并发控制。

5.创建一个文件描述符exec 3<>/tmp/fd1 不能有空格,代表文件描述符3有可读(<)可写(>)权限,注意,打开的时候可以写在一起,关闭的时候必须分开关,exec 3<&-关闭读,exec 3>&-关闭写。

### MOS管 H桥驱动电路 原理图 设计 图解 MOS管 H桥驱动电路是一种常见的电子电路,主要用于控制直流电机的正转、反转和速度调节。该电路因其结构形似字母“H”,故被称为H桥驱动电路[^3]。 #### 1. H桥驱动电路基本构成 H桥驱动电路的核心部分由四个开关元件(通常是N沟道或P沟道MOSFET)组成,分别位于H型结构的四条垂直支路上。这四个MOSFET通过特定的组合方式来改变流经电机线圈的电流方向,从而实现电机的正反转功能[^1]。 - **高侧开关**:通常采用P沟道MOSFET。 - **低侧开关**:通常采用N沟道MOSFET。 当某一组相对角上的MOSFET导通时,另一组则保持关闭状态,以此形成完整的回路供电机运行。 #### 2. 工作原理详解 为了使电机能够正常工作并完成转向切换操作,在实际应用过程中需遵循严格的时序逻辑: - 当Q1与Q4开启时,电流从电源流向电机再回到地端,此时电机顺时针旋转; - 而当Q2与Q3开启时,则相反路径下的电流使得电机逆时针转动; 值得注意的是,为了避免短路现象发生即所谓的“直通”情况——同一水平线上上下两个MOSFET同时打开的现象必须严格防止出现这种情况因为这样会直接造成大电流冲击损坏器件甚至整个系统因此在具体实施当中往往加入死区时间设置确保不会存在上述隐患[^4]。 #### 3. 实际设计注意事项 基于前述理论基础之上构建实际硬件还需要考虑诸多因素比如效率最大化减少热量损耗提高可靠性等方面的要求下面列举几个重要方面: - **选择合适的MOSFET型号**: 不同规格参数如耐压值(Vds), 导通电阻(Rdson)等都会影响最终效果所以要依据项目需求挑选最适宜的产品; - **优化驱动信号处理机制**: 高效稳定的PWM脉宽调制技术配合恰当延迟策略有助于提升整体性能表现同时也保护了敏感组件免受潜在损害风险的影响; 以下是简化版MOS管H桥驱动电路示意图代码片段展示如何利用Python绘制简单图形表示这一概念框架虽然这里仅作为示意并非真正意义上的完整工程文件但仍能帮助理解其内部连接关系布局特点等内容. ```python import matplotlib.pyplot as plt from schemdraw import Drawing, elements as elm with Drawing() as d: d += (Vdd := elm.SourceV().label('Vcc').up()) d += (Q1 := elm.Mosfet().at(Vdd.end).right().anchor('D')) d += (Motor := elm.Resistor().at(Q1.G).down().tox(Q1.S)) d += (Q2 := elm.Mosfet().flip().at(Motor.start).left().anchor('S')) d += (Gnd := elm.Ground().at(Q2.S)) plt.show() ``` 此段脚本运用Matplotlib库结合SchemDraw插件快速生成直观易懂的技术草稿便于进一步讨论修改完善直至达到预期目标为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值