Posted by Sandro Paganotti in Ruby on Rails - comments are closed
During the development of our current project we needed to handle a very long task (4 minutes). After a bit of googling i found spawn by Tom Anderson. Here’s how it works:
Spawn let you fork (or thread) a block of code by simply pass it as a parameter to a 'spawn’ function:
spawn do
# very long long task
end
what spawn do (when used with 'fork’) is recreate an ActiveRecord Connection inside a fork method and then execute your block of code. You can also set the priority of the process being create with the option 'nice’:
spawn(:nice => 7) do
# do something
end
Finally you can wait the end or your child processes with the method Spawn::wait() (I took this example from the official readme):
N.times do |i|
# spawn N blocks of code
spawn_ids[i] = spawn do
something(i)
end
end
# wait for all N blocks of code to finish running
wait(spawn_ids)
I haven’t tried to use spawn with threads but as far as I’ve tested it with fork, it works perfectly.