• Linux tips: shell中启动多进程并行批处理的技巧


    目录

    1. 前言

    2. 解决方案

    3. Windows下也可以这样运行


    1. 前言

            在很多情况下我们都可能需要以批处理的方式,执行大量的程序。比如说,通信算法仿真不同信道条件下的情况、神经网络的超参数搜索优化训练等等。

            最naive的方式是在shell脚本中,逐行列出需要执行的仿真命令,然后执行shell脚本。但是这样得到的效果是串行地执行shell脚本中的各条仿真命令,执行完一个再执行下一个。

            在多核CPU情况下,如果想充分利用计算资源,可以将仿真计算任务分散到多个脚本中然后逐个执行。

            有没有更高效的做法呢?

    2. 解决方案

            首先,可以用“&”将各个要执行的命令串接起来。

            “&”的作用就是将计算任务转为后台执行,然后启动新的进程执行接下来的任务。这样就不用等前面的任务执行完再执行后面的任务了,从而实现了并行执行的目的。如下例所示:

    #!/bin/sh

    (python my_train_01.py > my_train_01.log) & (python my_train_02.py > my_train_02.log)

            当然,每个子进程中仍然可以包含多个串行执行的程序,建议加括号()把这些串行执行的不同的程序放到一起,表示开启子shell作为一个独立的子进程运行。此外,如果一行太长了,可以最后加 ‘\’ 换行。这样就实现了在同一个脚本中实现了以串行和并行混合的方式对任意多个计算任务进行批处理,非常方便。一个稍微复杂一点的示例如下所示:

    #!/bin/sh

    ( ./sim_model  sim_1.cfg; \
      ./sim_model  sim_2.cfg; \
      ./sim_model  sim_3.cfg) &
    ( ./sim_model  sim_4.cfg; \
      ./sim_model  sim_5.cfg; \
      ./sim_model  sim_6.cfg) &
    ( ./sim_model  sim_7.cfg; \
      ./sim_model  sim_8.cfg) &

            以上例子中,仿真任务1,2,3作为一个子进程; 仿真任务4,5作为一个子进程; 仿真任务6,7,8作为一个子进程;共三个子进程并行执行。

    3. Windows下也可以这样运行

            在windows中,用Git Bash终端(或者cygwin等等)能够模拟shell的终端下当然也可以用以上的方式实现并行批处理执行了。(谢谢“王后驾到”博友的提示。。。)

  • 相关阅读:
    网络安全-黑客技术(自学笔记)
    【C语言】算法:二分查找
    长短期记忆网络(LSTM)原理解析
    【c++刷题Day2】专题2T4
    执行Maven项目时,无法解析项目的依赖关系
    Acwing算法心得——猜测短跑队员的速度(重写比较器)
    构造函数调用原则
    灰色关联分析
    手动实现:十进制转换十六进制
    React 组件实例的三大核心—props
  • 原文地址:https://blog.csdn.net/chenxy_bwave/article/details/127122129