Ruby 有没有处理即时并发任务的 gem 或方法推荐?

dddd1919 · 2014年08月18日 · 最后由 saiga 回复于 2014年08月18日 · 3147 次阅读

写个 task 把一堆文件处理并且信息保存到 mongo 数据库,本地文件量有近千万,任务是顺序执行,目前的速度瓶颈主要在文件处理上,每秒不到 2 个的处理速度,算下来执行完任务。。。。。。。哭了(其实任务操作很简单,就是文件量太大了),所以想找个多线程/多进程/并发任务的工具来批量执行文件处理任务,具体需求:

  1. 暂时只考虑 ruby (非 rails,觉得 ruby 目前还成不了 task 的瓶颈)
  2. 能并发的执行任务 (可以对每个文件拆分出数据和操作独立的的子任务)
  3. 可以控制并发数量 (控制任务的资源占用量)
  4. 尽量简单

由于对大量数据处理没什么经验(这里仅仅是数据多),大部分工作还是在逻辑处理上,特求经验分享!

另外贴上自己的尝试:

  1. Thread: 不好拿捏,曾经用 thread 做过并发的消息处理,某个 thread 自身出现问题处理起来不方便,另外没法对 thread 并发做限制(可能个人经验不足把,thread 跑起来和 nodejs 一样像个疯子)
  2. 目前正在尝试 resque 和 sidekiq(刚上手),把文件处理放到队列中,减少顺序任务的执行时间,不过不太了解队列任务是否并发执行,如果是而且可以设置并发量那太好了,基本解决现有问题

如果是文件处理是 cpu 密集型的话,不要考虑 ruby 的线程 然后如果是 io 密集的话,你这里没必要用 mq,直接用 queue+thread 就可以了。限制 thread 数量只需要预先创建就可以了,或者可以考虑用线程池 ruby-thread

补充: sidekiq 是多线程默认是 25 个 workers... resque 是多进程,可以并行

综上,用 resque 吧

#1 楼 @saiga 文件处理主要是用 imagemagick 压图,应该算 cpu 密集型的吧,用 resque 试一下,谢谢啦。 运行 task 需要很长时间,thread 也怕影响其他的服务

需要 登录 后方可回复, 如果你还没有账号请 注册新账号