1

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

我想扩充这段代码,以便可以给出一个数量(N)(在虚拟机上执行的命令,我希望能够通过一次调用启动一个可变数字),并让 shell 进程被调用 N 次单独的进程,第 N 个调用不必等待调用 N-1 完成,依此类推。我还想从每次调用中捕获所有 STDOUT,以便在调用完成后对输出进行处理。

我已经看过了,Kernel::fork但是分叉​​块内的代码范围与其父级不同(出于非常明显的原因)。

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

4

1 回答 1

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}

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

于 2012-07-17T18:18:04.127 回答