通过启动多个进程而不是使用线程来扩展ruby脚本

时间:2010-05-11 12:34:42

标签: ruby linux scaling

我想增加执行net I / O(刮刀)的脚本的吞吐量。我没有在ruby中使用多线程(我使用默认的1.9.1解释器),而是想启动多个进程。那么,是否有一个系统可以执行此操作,以便我可以在完成再次重新启动时跟踪,以便我可以随时运行X号码。另外一些将使用不同的命令args运行。我正在考虑编写一个bash脚本,但如果已经存在一种在linux上执行此类操作的方法,那听起来似乎是个坏主意。

3 个答案:

答案 0 :(得分:2)

我建议不要分叉,而是使用EventMachine(如果您正在使用HTTP,则使用优秀的em-http-request)。管理多个进程可能有点少,甚至比处理多个线程更多,但相比之下,沿着规范路径走下去要简单得多。由于你想要主要做的主要是等待的网络IO,我认为一种公平的方法也可以扩展,或者比分叉或线程更好。最重要的是:它将需要更少的代码,并且更具可读性。

即使您决定为每个任务运行单独的进程,EventMachine也可以帮助您编写管理子进程的代码,例如EventMachine.popen

最后,如果您想在没有EventMachine的情况下执行此操作,请阅读IO.popenOpen3.popenOpen4.popen的文档。所有这些都或多或少地做同样的事情,但是你可以访问子进程的stdin,stdout,stderr(Open3,Open4)和pid(Open4)。

答案 1 :(得分:1)

您可以尝试前叉http://ruby-doc.org/core/classes/Process.html#M003148

您可以获得PID并查看此过程是否再次运行。

如果要管理IO并发。我建议你使用EventMachine。

答案 2 :(得分:0)

你可以

  1. 实现(或找到一个等效的gem)一个ThreadPool(在你的情况下是ProcessPool),或者
  2. 准备一个全部数组,假设需要处理1000个任务,将其拆分为10个100个任务块(10个是您要启动的并行进程数),并启动10个进程,其中每个进程马上收到100个要处理的任务。这样,您就不需要启动1000个进程并控制不超过10个进程同时工作。