2012-07-17 162 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