Bash多层嵌套for循环如何仅实现最内层代码并行执行
问题根因
你当前的代码将wait放在了所有循环的最外层,导致每一轮外层aggr、ran循环启动完内层后台任务后不会等待,直接进入下一轮外层循环,所有批次的内层任务被同时放到后台执行,最终输出混合。
解决方案
将wait移动到每一轮ran循环的末尾,保证当前批次的所有内层并行任务执行完成后,再进入下一轮外层循环,修改后的完整代码如下:
#!/bin/bash #aggrs=(gcnconv gatconv sageconv ginconv) aggrs=(gcnconv) datasets=(HGBn-ACM HGBn-DBLP HGBn-Freebase HGBn-IMDB) models=(homo_GNN relation_HGNN mp_GNN) #models=(homo_GNN relation_HGNN) ran=(1 2) for aggr in ${aggrs[*]}; do for i in ${ran[*]}; do yaml="yamlpath: ${aggr}_${i}.yaml" echo ${yaml} # python space4hgnn/generate_yaml.py -a ${aggr} -s ${i} for dataset in ${datasets[*]}; do for model in ${models[*]}; do { para="-a ${aggr} -s ${i} -m ${model} -d ${dataset} -g $1 -t node_classification" echo ${para} # python run.py ${para} }& done done # 等待当前批次所有内层后台任务执行完成 wait done done
效果说明
修改后,每一轮aggr+i的组合会先输出yaml路径,再启动所有对应dataset和model的任务并行执行,等这一批所有任务执行完成后,才会进入下一轮i或者aggr的循环,完全符合你预期的外层串行、内层并行的执行逻辑,输出也会按批次分组展示。
如果需要进一步控制同批次内并行任务的输出顺序,可以将每个任务的输出先写入临时文件,等当前批次所有任务执行完成后再统一按顺序打印临时文件内容即可。
内容的提问来源于stack exchange,提问作者liushi
相关产品推荐
相关产品推荐

