shell并发

Shell Liemer_Lius 42℃

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并发

喜欢 (4)