使用FIFO的文件控制shell的线程数

有的时候我们跑一个批量的脚本并发不能太大,需要对线程控制。这个就是本脚本使用的场景。

#!/bin/bash

date +'%Y/%m/%d %H:%M:%S'

HADOOP_CONF_DIR=/opt/cloudera/parcels/SPARK2-2.1.0.cloudera1-1.cdh5.7.0.p0.120904/lib/spark2/conf/yarn-conf
export HADOOP_CONF_DIR

PYSPARK_PYTHON=/var/local/anaconda3/bin/python
export PYSPARK_PYTHON

tmp_fifofile="/tmp/$$.fifo"
mkfifo $tmp_fifofile      # 新建一个fifo类型的文件 
exec 6<> $tmp_fifofile   # 将fd6指向fifo类型
rm $tmp_fifofile

thread=3
# 此处定义线程数
for ((i=0;i<$thread;i++)); do
echo
done >& 6 #在fd6中放置了$thread个回车符

for ((i=3;i<4;i++))
do
read -u6 # 一个read -u6命令执行一次,就从fd6中减去一个回车符,然后向下执行
{
    {
    /opt/cloudera/parcels/SPARK2/bin/spark2-submit --master yarn --deploy-mode client /home/wangxin/step3test.py $i
    } && {
        echo "subprocess is finished"
    } || {
        echo "error"
    }
        echo >& 6 #当进程结束以后,再向fd6中加上一个回车符,即补上了read -u6减去的那个
} &
done

wait # 等待所有后台子进程结束

exec 6>&- #关闭fd6

date +'%Y/%m/%d %H:%M:%S'

exit 0

猜你喜欢

转载自blog.csdn.net/wx740851326/article/details/82701382