2012-07-17 161 views
1

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

我想增加这段代码,以便给出一个数量(N)(命令在板载虚拟机上执行,我希望能够用一次调用启动一个变量),并让shell进程成为在单独的进程中被称为N次,而第N次呼叫不得不等待呼叫N-1完成,等等。我也想从每个调用中捕获所有的STDOUT,这样一旦调用完成,我就可以在输出上工作。

我已经看过Kernel::fork,但分叉块内的代码范围与其父项不一样(原因很明显)。

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

回答

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} 

的滋生它们并联,每个线程在等待时,它的情况下完成。当实例完成时,它会处理输出并返回。主线程等待所有其他人完成。

+0

请问您能澄清一些吗?线程在调用Thread.new或t.join时是否开始处理? – asfallows 2012-07-17 19:42:59

+0

@asfallows:'Thread.new'。 't.join'等待线程完成。 – Linuxios 2012-07-17 19:45:02

+0

谢谢!我会玩这个。应该是我所需要的。 – asfallows 2012-07-17 19:48:26