網站首頁 編程語言 正文
并發控制實例
腳本實現多線程并發控制的原理:
首先定義并發的數量,然后創建管道文件,并往管道文件中插入數據(可以是空行),
然后定義分隔符,以分隔符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`"
原文鏈接:https://blog.csdn.net/qq_23564667/article/details/127203829
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2022-07-21 toggleRowSelection失效的2個原因
- 2022-10-09 C#實現折半查找算法_C#教程
- 2022-04-04 Error running : No valid Maven installation found.
- 2022-11-27 Ceph集群CephFS文件存儲核心概念及部署使用詳解_其它綜合
- 2022-06-15 C++模擬實現List迭代器詳解_C 語言
- 2022-12-29 React動態更改html標簽的實現方式_React
- 2022-06-27 C#?使用Log4net添加日志記錄的方法_C#教程
- 2022-06-12 C語言sizeof和strlen的指針和數組面試題詳解_C 語言
- 欄目分類
-
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支