1. 单纯并发
# 并发100个
for ALL_TIMES in {1..100}; do
{
echo Hello
sleep 1
} &
done
# 等待后台进程执行完成
wait
注:这样的话,如果数量太大,会把机器压死,需要加一个管道
2. 管道并发
#!/bin/bash
# 创建fifo文件
mkfifo lius.fifo
# 绑定fifo文件到5号文件描述符, < 表示写入, > 表示读取, 方向是以文件描述符为基准
exec 5<>lius.fifo
# 删除这个fifo文件, 已经没用了
rm -f lius.fifo
# 写入10个空行到5号文件描述符, fifo并发是用行来实现的
for SPACE_LINE in {1..10}; do
echo >&5
done
echo "StartTime: `date +%s`"
# 并发100个, 管道容量上面定义的是10
for ALL_TIMES in {1..100}; do
# 读取5号文件描述符
read -u5
{
echo Hello
sleep 1
# 执行完成一个, 需要在5号文件描述符加一行, 否则消费完了10个就没有了
echo >&5
} &
done
# 等待后台进程执行完成
wait
echo "EndTime: `date +%s`"
# 解除绑定必须是分开进行的
exec 5<&-
exec 5>&-
转载请注明:liutianfeng.com » shell并发