我正在使用resque,使用队列处理器,作为执行的一部分,它将启动一个shell进程。目前,我正在使用PTY.spawn()
来调用shell命令并处理其输出。
我想增加这个代码,以便可以给出数量(N)(执行板上VM的命令,我希望能够通过一次调用启动变量号),并调用shell进程在单独的进程中N次,没有第N次呼叫必须等待呼叫N-1完成,依此类推。我还希望从每次调用中捕获所有STDOUT,以便在调用完成后我可以对输出进行操作。
我查看过Kernel::fork
但是分叉块内的代码范围与其父代不同(原因很明显)。
我可以使用哪些工具,以便每个进程可以独立生成,可以捕获它们的输出,并且我仍然可以让父进程等待它们全部完成,然后再继续?
答案 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}
并行产生它们,每个线程在它的实例完成时等待。当它的实例完成时,它处理输出并返回。主线程正在等待所有其他人完成。