Shell 如何分配循环以在每个核心上运行一次迭代

Shell 如何分配循环以在每个核心上运行一次迭代,shell,loops,parallel-processing,Shell,Loops,Parallel Processing,我正在一台30核的服务器上运行一个shell脚本中的半大型循环。它看起来像下面的那个。我希望将此循环分发给每个核心运行一次迭代: python sim_fine.py model1在核心1上弱a真-->时, 核心2上的python sim_fine.py model1弱b真--> 等等 我想利用30个核心中的20个来完成他的过程。基本上我想要的是迭代不要等到上一个完成,然后再开始下一个。当然,这种情况可能只发生20次。我一直在网上搜索,但在这个话题上找不到任何帮助 for m in model1

我正在一台30核的服务器上运行一个shell脚本中的半大型循环。它看起来像下面的那个。我希望将此循环分发给每个核心运行一次迭代:

python sim_fine.py model1在核心1上弱a真-->时,
核心2上的python sim_fine.py model1弱b真-->
等等

我想利用30个核心中的20个来完成他的过程。基本上我想要的是迭代不要等到上一个完成,然后再开始下一个。当然,这种情况可能只发生20次。我一直在网上搜索,但在这个话题上找不到任何帮助

for m in model1 model2;
    do
    for s in weak strong;
        do
        for opt_dict in a b c d;
            do
                python sim_fine.py $m $s $opt_dict true
            done
        done
    done

我会使用GNU Parallel,尽管它似乎只产生16个工作岗位,而不是您指出的20个:

parallel --dry-run python sim.py ::: model{1,2} ::: weak strong ::: {a..d}
样本输出

python sim.py model1 weak a
python sim.py model1 weak b
python sim.py model1 weak c
python sim.py model1 weak d
python sim.py model1 strong a
python sim.py model1 strong b
python sim.py model1 strong c
python sim.py model1 strong d
python sim.py model2 weak a
python sim.py model2 weak b
python sim.py model2 weak c
python sim.py model2 weak d
python sim.py model2 strong a
python sim.py model2 strong b
python sim.py model2 strong c
python sim.py model2 strong d
如果看起来不错,请认真运行,不要使用
--干运行
。如果确实要将并行作业数限制为20,请使用:

parallel -j 20 ...
如果您运行
manparallel
,则有许多非常灵活的选项用于处理日志记录、报告和错误处理

我在参数处理方面有些懒惰/简洁,您可以更明确地使用:

parallel --dry-run python sim.py {1} something {2} somethingelse {3} true ::: model{1,2} ::: weak strong ::: {a..d}

谢谢你,马克!!是的,我缩短了循环以减少混乱,然后我设法进行了20次以下的迭代。我的错!当我运行这个程序时,我现在会收到一个错误,上面写着:“/bin/bash:sim.py:Permission denied”。你知道为什么会发生这种情况吗?对不起,我复制得不好,你想要
sim\u fine.py
Ohh这不是因为名称错误。可能是因为缺少“$”。我解决了问题。这是因为我的本地服务器受到一些限制。再次感谢你!我感谢你的帮助!