Linux环境下批量执行队列任务

一,任务脚本

下面是一个玩具Python代码,从参数中读取城市和日期信息,在该城市该日期参数下进行数据挖掘

import sys
arg = sys.argv[1]
city,date = arg.split(" ")
print(f"data mining task@{city}, date={date}")
python task.py "北京 20200101"

二,提交脚本

这个脚本的关键有三处:

一是使用字符串分割转换成数组来获取参数列表。
二是使用Linux中的&符号开启多进程任务并行执行不同参数的任务。
三是使用FIFO管道在进程间通信来控制并行的任务数量。

#!/bin/bash

#允许同时跑的任务数为THREAD_NUM
THREAD_NUM=3 #todo: revise me 

args="""
北京 20200101
上海 20200202
深圳 20200303
广州 20200404
南京 20201001
天津 20200901
武汉 20201101
南昌 20200809
成都 20200901
""" #todo: revise me

#指定分隔符
IFS='
'
array=(${args})

#定义描述符为9的FIFO管道
mkfifo tmp
exec 9<>tmp
rm -f tmp

#预先写入指定数量的空格符,一个空格符代表一个进程
for ((i=0;i<$THREAD_NUM;i++))
do
    echo >&9
done

for arg in ${array[@]}; do
  #控制进程数:读出一个空格字符,如果管道为空,此处将阻塞
  read -u9
  {
     #打印参数 
     #echo ${arg} 
     #此行代码指定任务提交方法
     python task.py ${arg} #todo : revise me!
     #每执行完一个程序,睡眠3s
     sleep 3
     #控制进程数:一个任务完成后,写入一个空格字符到管道,新的任务将可以执行
     echo >&9
  }&
done
wait
echo "\n全部任务执行结束"
sh a_lot_jobs.sh

参考链接:https://cloud.tencent.com/developer/article/1755692

你可能感兴趣的:(linux,运维,服务器)