Skip to content

Instantly share code, notes, and snippets.

/ruby.rb Secret

Created December 2, 2015 21:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anonymous/8a51721667d4b5a4cfae to your computer and use it in GitHub Desktop.
Save anonymous/8a51721667d4b5a4cfae to your computer and use it in GitHub Desktop.
require 'timeout'
MAX_PROCESSES = 5
MAX_TIME = 30
command = #SOME LONG RUNNING PROCESS WITH LOTS OF OUTPUT
spoons = {}
finished_spoons = {}
unfinished_spoons = {}
MAX_PROCESSES.times do |i|
spoon = {}
spoon['read'], spoon['write'] = IO.pipe
spoon['fork'] = spawn(command, :out => spoon['write'], :err => spoon['write'])
spoons[spoon['fork']] = spoon
end
begin
Timeout.timeout(MAX_TIME) {
while !spoons.empty? do
pid, status = Process.wait2
finished_spoons[pid] = spoons[pid]
spoons.delete(pid)
end
}
rescue Timeout::Error
puts "\nNot all processes ended before timeout. Killing remaining processes.\n"
kill_spoons = true
end
if kill_spoons
spoons.each do |key, spoon|
Process.kill(9, spoon['fork'])
unfinished_spoons[spoon['fork']] = spoon #make it un-finished
end
end
finished_spoons.each do |key, spoon|
spoon['write'].close
output = spoon['read'].read
spoon['read'].close
#do stuff with output
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment