如何解决shell阻止多进程运行的问题

问题: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模块试试。