问题:shell脚本不能并行运行,只能在一个循环完成后,再运行下一个循环,请问如何解决。
程序的逻辑:在A 环境运行python脚本,其中有一步,需要运行shell脚本,并在shell脚本中切换到B环境,然后多进程并行运行python脚本。
python脚本片段如下:
p = Pool(2)
name = 0
cmd_sh = "./VC.sh ' {}' ' {}' ' {}' "
for i in range(len(audio_files)):
p_sh = os.system(cmd_sh.format(var1, var2, var3))
res = p.apply_async(p_sh, args=(var1, var2, var3,))
name += 1
time.sleep(2)
print(f'\trunning {name} times ')
p.close()
p.join()
调用的shell脚本如下:
#!/usr/bin/env bash
source /home/theonemagic/anaconda3/etc/profile.d/conda.sh
echo "change the envs"
conda activate VC
conda info --envs
echo "run VC programme"
python inference.py --checkpoint_path checkpoints/VC.pth --var ${1} --var ${2} --var ${3}
你可以把第8行, time.sleep(2) 这句删掉。
你只是并发去执行p_sh,后面的sleep将成为瓶颈
题主的问题不在于shell,而是进程函数错误地使用了os.system,因为os.system是阻塞式的,执行不完是不会进入下一行代码的。建议改用subprocess模块试试。