并发控制实例
脚本实现多线程并发控制的原理:
首先定义并发的数量,然后创建管道文件,并往管道文件中插入数据(可以是空行),
然后定义分隔符,以分隔符xx运行管道文件,
在删除管道文件,因为删除管道文件不会影响句柄,
在使用read -u命令读取分隔符内容,
如果能读到数据则执行对应的后台进程,如果读取不到则一直等待,
并发进程并不是等所有都执行完一轮后在执行新的一轮,而是完成一个后就会返回,
比如控制 的并发数是50,那么始终都会是50个后台进程一起执行,直到程序结束
模拟并发示例
#!/bin/bash
#------------创建用户实现并发控制------------
#------------shell多线程/多进程-------------------
#定义脚本运行的开始时间
start_time=`date +%s`
#并发数量,一次性能同时存在多少个进程
bfcs=50
#管道文件
fifofile=/tmp/fd_test.fifo
#创建管道文件
mkfifo $fifofile
#打开管道文件并定义为分隔符4
exec 4<> $fifofile
#删除管道文件
rm -rf $fifofile
#向管道文件插入空行
for i in $(seq $bfcs)
do
echo >&4
done
for i in $(seq -w 1000)
do
read -u 4 #读取分隔符4,如果读到行则执行下面命令,否则一直等待
{
sleep 1 #sleep 1用来模仿执行一条命令需要花费的时间(可以用真实命令来代替)
echo 'success'$i
echo >&4 #当运行完命令后则重新向管道文件插入新的行,以便后续进程进行使用
}&
done
wait
exec 4>&- #当所有循环完成后释放分隔符
echo "finish........."
stop_time=`date +%s` #定义脚本运行的结束时间
echo "TIME:`expr $stop_time - $start_time`"
ping主机实现并发控制
#!/bin/bash
#----------------------控制进程并发数量---------------------
#-------------shell多进程/多线程------------------
#定义脚本运行的开始时间
start_time=`date +%s`
#定义控制并发的数量
bfsl=10
#定义管道文件
fifofile=/tmp/fdping.fifo
#创建管道文件
mkfifo $fifofile
#以文件描述符3打开管道文件
exec 3<> $fifofile
#删除管道文件,因为文件描述符打开的文件即使删除句柄也不会被释放
rm -rf $fifofile
#循环往管道文件中写入内容
for i in $(seq $bfsl)
do
echo >&3 #这个表示只写入回车
done
for i in {1..254}
do
read -u 3 #-u表示对文件描述符进行读取,如果能读取则执行下面的命令,如果不能则等待
{
ip=192.168.81.$i
ping -c1 -W1 $ip &>/dev/null
if [ $? -eq 0 ];then
echo "$ip is up"
else
echo "$ip is down"
fi
echo >&3 #由于之前是从管道文件中读走了一行,这里要在还回去一行,让后面的进程进行使用
}&
done
wait
exec 3>&- #释放文件描述符
echo "finish.............."
stop_time=`date +%s` #定义脚本运行的结束时间
echo "TIME:`expr $stop_time - $start_time`"
创建用户实现并发控制
#!/bin/bash
#------------创建用户实现并发控制------------
#------------shell多线程/多进程-------------------
#定义脚本运行的开始时间
start_time=`date +%s`
#并发数量,一次性能同时存在多少个进程
bfcs=50
#管道文件
fifofile=/tmp/user_fd.fifo
#创建管道文件
mkfifo $fifofile
#打开管道文件并定义为分隔符4
exec 4<> $fifofile
#删除管道文件
rm -rf $fifofile
#向管道文件插入空行
for i in $(seq $bfcs)
do
echo >&4
done
for i in $(seq -w 1000)
do
read -u 4 #读取分隔符4,如果读到行则执行下面命令,否则一直等待
{
user=qwe$i
useradd $user
echo "123" |passwd --stdin $user &>/dev/null
if [ $? -eq 0 ];then
echo "$user is created..."
fi
echo >&4 #当运行完命令后则重新向管道文件插入新的行,以便后续进程进行使用
}&
done
wait
exec 4>&- #当所有循环完成后释放分隔符
echo "finish........."
stop_time=`date +%s` #定义脚本运行的结束时间
echo "TIME:`expr $stop_time - $start_time`"