bash多进程执行python脚本

需求:

例如同时执行n个多卡训练python脚本(n个程序均使用相同的卡,且显存充足的前提下),或同时开启多个CPU任务python脚本。

注意:
  • for循环内不要使用if-continue,会导致堵塞,改用if-else;
  • 多进程启动后使用Ctrl+C终止会清理不干净,可以使用ps命令查询并kill,例如:
    • ps -aux|grep xxx.sh 查询当前有几个子进程;
    • ps aux|grep xxx.sh |grep -v grep|cut -c 9-15|xargs kill -15 kill所有子进程。

完整代码:

#!/usr/bin/env bash

############################# 单进程 #############################
for ((i=0; i<20;i++))
do
        echo $i # 执行脚本
        # python .... # 执行脚本
        sleep 3 # 执行脚本
done

############################# 单进程 #############################


############################# 多进程 #############################
Npro=4 #并行n个子进程
tmp_fifo="/tmp/$$.fifo" # 脚本运行的当前进程ID号作为文件名
mkfifo $tmp_fifo # 新建一个随机fifo管道文件
exec 6<>$tmp_fifo # 将fd 6指向该文件(定义文件描述符6指向这个fifo管道文件)
rm -f $tmp_fifo
for((i=1; i<=$Npro; i++)); do
        echo
done >&6 # 在fd 6指向的文件(fifo)中放置$Npro个回车符,作为令牌

####### 替换原for循环 #######
for ((i=0; i<20;i++))
####### 替换原for循环 #######
do
        read -u6 #从fd 6中读出减去一个回车符,然后向下执行
        			#如果fd 6中没有回车符了,进程阻塞在这儿
        {
        ############## 替换原执行脚本 ##############
        echo $i # 执行脚本
        # python .... # 执行脚本
        sleep 3 # 执行脚本
        ############## 替换原执行脚本 ##############
        echo >&6 #向fd6加上一个回车符
        } & #花括号体内的程序后台作为一个子进程执行
# 继续等待 read 中读取fifo数据,当后台的n个子进程完成python后,按次序
# 排队往fifo输入空行,这样fifo中又有了数据,for语句继续执行
done
wait
exec 6>&- #关闭fd6
############################# 多进程 #############################

参考链接:Link1Link2Link3

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值