我使用以下脚本在服务器中生成多个python脚本。每个脚本l
给出的参数都不同,从 0 到 150 不等。
for i in `seq 0 9`;
do
for j in `seq 0 14`;
do
f=$((i*15))
l=$((j+f))
./script --l ${l} &
done
i=0
for job in `jobs -p`
do
pids[${i}]=${job}
i=$((i+1))
done
for pid in ${pids[*]}; do
wait ${pid}
done
done
上面的语法生成 15 个 python 脚本,并等待每个子进程完成,然后再生成后续的 15 个。但是,python脚本对于某些l
值花费的时间很少,而对于其他l
值则需要大量时间。我的问题是,如果对于一组给定的 15 个l
值,脚本对其中 14 个值花费的时间很少,而对于一个值l
花费大量时间,那么上面的脚本会等待一个脚本完成,然后再生成下一个 15 个,这会导致服务器中的许多内核保持空闲状态。我想知道是否有办法修改上面的代码,以便在每次其中一个子进程完成时生成一个新的子进程(以便在任何给定时间运行 15 个子进程(。
谢谢
这应该可以解决问题:
for i in $(seq 150)
do
while [[ $(jobs | wc -l) -ge 15 ]]
do
wait -n $(jobs -p)
done
script --l "$i" &
done
这个想法是,如果有 15 个或更多作业,请等到其中至少一个完成,直到运行不超过 15 个;然后生成下一个。wait -n
很有用,因为当上述任何进程退出时,它将停止等待。