大家实现基本有两种方式,管道队列与循环轮询
管道队列有着很低的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}>&- #关闭之前绑定的文件操作符
#主程序段结束
网友评论