Если вы счастливы использовать потоки, а не процессы, то что-то вроде этого может быть немного масштабируемым до более чем одного форка:
def doit(x)
sleep(rand(10))
puts "Done... #{x}"
end
thingstodo = ["a","b","c","d","e","f","g"]
tasklist = []
# Set the threads going
thingstodo.each { |thing|
task = Thread.new(thing) { |this| doit(this) }
tasklist << task
}
# Wait for the threads to finish
tasklist.each { |task|
task.join
}
Пожалуйста, ознакомьтесь с отличными комментариями и рекомендациями Джона Топли ниже относительно модели выполнения Ruby и ее ограничений.
Только что отредактировано, чтобы исправить явную ошибку (без назначения на задачу) и следовать совету @ (Джейсона Кинга).