在Ruby中同时生成子进程

时间:2012-07-17 17:50:09

标签: ruby resque

我正在使用resque,使用队列处理器,作为执行的一部分,它将启动一个shell进程。目前,我正在使用PTY.spawn()来调用shell命令并处理其输出。

我想增加这个代码,以便可以给出数量(N)(执行板上VM的命令,我希望能够通过一次调用启动变量号),并调用shell进程在单独的进程中N次,没有第N次呼叫必须等待呼叫N-1完成,依此类推。我还希望从每次调用中捕获所有STDOUT,以便在调用完成后我可以对输出进行操作。

我查看过Kernel::fork但是分叉块内的代码范围与其父代不同(原因很明显)。

我可以使用哪些工具,以便每个进程可以独立生成,可以捕获它们的输出,并且我仍然可以让父进程等待它们全部完成,然后再继续?

1 个答案:

答案 0 :(得分:1)

下面:

stdouts=[]
numberOfProcesses.times do 
  stdouts<<PTY.spawn(command_line)[0..-1]
end

如果您只是生成它们并获得一堆STDOUT / STDIN对,这是非常基本的。如果您希望能够在完成后立即处理每个进程的输出,请尝试以下操作:

threads=[]
numberOfProcesses.times do
  threads<<Thread.new(command_line) |cmd|
    stdout, stdin, pid = PTY.spawn(cmd)
    Process.waitpid(pid)
    process_output(stdout.read)
  end
end
threads.each {|t| t.join}

并行产生它们,每个线程在它的实例完成时等待。当它的实例完成时,它处理输出并返回。主线程正在等待所有其他人完成。