【问题标题】:Linux bash multithread/process small jobsLinux bash 多线程/处理小型作业
【发布时间】:2012-06-02 00:35:22
【问题描述】:

我有一个脚本可以运行一些数据处理命令 10K 次。

foreach f (folderName/input*.txt)
  mycmd $f
end

我已将每个“mycmd $f”的运行时间定为 0.25 秒。 运行 10K 次,加起来超过 1 小时。 我在 16 核 nehalem 上运行它。 不在剩下的 15 个内核上运行是一种巨大的浪费。

我已经尝试过睡眠,但不知何故,脚本在 3900 次迭代左右因警告或错误而死,见下文。睡眠时间越短,死得越快。

foreach f (folderName/input*.txt)
  mycmd $f & ; sleep 0.1
end

必须有更好的方法。 注意:我更喜欢 shell 脚本解决方案,我们不要在 C/C++ 领域徘徊。

谢谢

问候

【问题讨论】:

  • 错误是什么?此外,您将使用所有 16 个内核,除非您以某种方式以自定义方式设置了亲和力。无论 [mycmd] 实际在做什么,速度都很慢。
  • 您可能产生了太多进程。睡眠时间越短,您在完成之前启动的进程就越多。
  • 这看起来像 PHP 或 Perl 而不是 Bash。这是什么?

标签: linux multithreading bash shell multiprocessing


【解决方案1】:

将文件列表传送到

xargs -n 1 -P 16 mycmd

例如:

echo folderName/input*.txt | xargs -n 1 -P 16 mycmd

【讨论】:

  • 同时使用 lsxargs 可能会导致问题(例如,如果文件名称中有空格):find folderName -maxdepth 1 -name 'input*.txt' -print0 | xargs -0 ... 更安全。
  • 已编辑;将ls 替换为echo。我敢肯定,仍然可以改进。
  • @tripleee,echo 并不比ls 好。文件名中的空格仍然存在完全相同的问题。
  • 是的,它只是避免了 ls 特有的问题(比如递归到子目录,当然你可以用 ls -d 或 LSD 来修复 - 抱歉,无法抗拒)和保存一个进程,前提是 echo 内置在你的 shell 中。
  • 稍微澄清一下,原来的代码是 csh 而不是 bash,我的脑子只是滑了一下。我的命令也将 3 个参数作为输入。所以我最终使用 xargs -n 3 -P 16 mycmd
【解决方案2】:

使用以下应用程序之一可能还有其他一些解决方案:

xjobs

Parallel

PPSS - Parallel Processing Shell Script

runpar.sh

【讨论】:

    【解决方案3】:

    使用batch提交工作;这应该可以解决负载平衡和资源不足的问题。

    for f in folderName/input.*; do
        batch <<____HERE
            mycmd "$f"
    ____HERE
    done
    

    (不能 100% 确定引号是否正确和/或有用。)

    【讨论】:

      【解决方案4】:

      使用 GNU Parallel,您可以:

      parallel mycmd ::: folderName/input*.txt
      

      发件人:http://git.savannah.gnu.org/cgit/parallel.git/tree/README

      = 完整安装 =

      GNU Parallel 的完整安装非常简单:

      ./configure && make && make install
      

      如果您不是 root,您可以将 ~/bin 添加到您的路径并安装在 ~/bin 和 ~/share:

      ./configure --prefix=$HOME && make && make install
      

      或者,如果您的系统缺少“make”,您可以简单地复制 src/parallel src/sem src/niceload src/sql 到你路径中的一个目录。

      = 最小安装 =

      如果您只需要并行并且没有安装“make”(也许 旧系统或 Microsoft Windows):

      wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
      chmod 755 parallel
      cp parallel sem
      mv parallel sem dir-in-your-$PATH/bin/
      

      观看介绍视频以快速了解: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

      【讨论】:

        猜你喜欢
        • 2012-10-30
        • 1970-01-01
        • 1970-01-01
        • 2012-11-12
        • 2016-04-29
        • 2013-06-29
        • 2012-07-25
        • 2020-07-23
        • 2010-10-08
        相关资源
        最近更新 更多