#!/bin/bash
set -e
# 设置并发数
PROC_NUM=10
# 以主进程PID命名管道文件
FIFO_FILE="/tmp/$$.fifo"
# 新建管道文件
mkfifo ${FIFO_FILE}
# 生成文件描述符9指向管道文件;"<"表示可读,">"表示可写
exec 9<>${FIFO_FILE}
# 向文件描述符中写入设置的并发数量的行数,模拟生成进程池;一行就是一个子进程
for process_num in $(seq ${PROC_NUM})
do
echo "$(date +%F\ %T) Processor-${process_num} Info: " >&9
done
# 按并发数设置执行任务
for n in $(seq 100)
do
# 从文件描述符中读取一行,读到后生成子进程向下执行,读不到就等待;模拟进程锁
read -u 9 P
{
# 子进程执行的实际任务
echo "${P} "
sleep(2)
# 将从文件描述符中读取的内容重新写回文件描述符;模拟释放进程锁
echo ${P} >&9
} &
done
wait
echo "All Completed"
# 删除文件描述符
exec 9>&-
# 删除临时管道文件
rm -f ${FIFO_FILE}
exit 0