Linux学习|Gentoo/Arch/FreeBSD我用 Linux

bash下可控任务数的并发执行脚本

2019-09-30  本文已影响0人  FSS_Sosei

大家实现基本有两种方式,管道队列与循环轮询

管道队列有着很低的CPU占用率,所以多数用这种

#!/bin/bash

#下面这段是生成测试用例

function test_cases ()  #一个测试并发用的例子命令

{

rv_rand=$(($RANDOM % 6 + 5))

echo "The current subprocess sleep time is ${rv_rand}s..."

sleep ${rv_rand}

return $(($RANDOM % 2))

}

rv_command_array=()  #要并发的命令每条都放入这个数组

for ((rv_i=0; rv_i<64; ++rv_i))  #比如有64条命令要并发执行

do

rv_command_array[${rv_i}]="test_cases"  #就都先放入rv_command_array数组

done

#生成测试用例段结束

#下面主程序段开始

rv_max_num_of_concurrent_tasks=8  #设最大并发任务数

rv_temp_fifo_file="/tmp/fifo_${$}.tmp"; mkfifo ${rv_temp_fifo_file} #创建一个管道文件

exec {MYFD}<>${rv_temp_fifo_file}  #把“{MYFD}”这系统分配的空闲FD与管道文件绑定

rm -f ${rv_temp_fifo_file}  #删除管道文件

for ((rv_i=0; rv_i<rv_max_num_of_concurrent_tasks; ++rv_i))

do

echo >&${MYFD}  #放入最大并发进程数个“队列空闲”标记(发送空行就可以)

done

rv_command_num=${#rv_command_array[@]}  #获得待执行命令数组的长度

for ((rv_i=0; rv_i<rv_command_num; ++rv_i))  #遍历待执行命令

do

read -u ${MYFD}  #取走一个“队列空闲”标记,从管道队列读取不到标记则阻塞等待

{

${rv_command_array[${rv_i}]} &&  #从rv_command_array取出一条待执行的命令,以后台方式执行

{

echo "Subprocess execution complete."

} ||

{

echo "Subprocess execution error."

}

echo >&${MYFD}  #一条命令执行完成后,才往管道队列放入一个“队列空闲”标记

} &

done

wait  #等待所有后台进程执行完

exec {MYFD}>&-  #关闭之前绑定的文件操作符

#主程序段结束

上一篇下一篇

猜你喜欢

热点阅读