liunx shell脚本并发控制详解

并发控制实例

脚本实现多线程并发控制的原理:
首先定义并发的数量,然后创建管道文件,并往管道文件中插入数据(可以是空行),
然后定义分隔符,以分隔符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`"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值