Я хочу разгрузить блок кода в моем основном процессе для дочернего процесса, чтобы он запускался одновременно. Я также хочу иметь PID порожденного дочернего процесса, чтобы я мог контролировать и убивать его, если это необходимо.
Как вы создаете дочерний процесс в Ruby?
Ответ 1
Вы можете использовать метод ядра fork
. Вот пример:
#!/usr/bin/env ruby
puts "This is the master process."
child_pid = fork do
puts "This is the child process"
exit
end
puts "The PID of the child process is #{child_pid}"
Метод fork
возвращает PID процесса, который он вилки, и выполняет любой код в переданном блоке. Как и обычные блоки Ruby, он сохраняет привязки родительского процесса.
Это хорошая идея сделать ваш разветвленный процесс exit
.
Ответ 2
В дополнение к замечательному ответу Криса, не забудьте позвонить Process.wait
от своего хозяина, чтобы пожинать ваш дочерний процесс, иначе вы оставите зомби позади.
Пример, запрошенный в комментариях:
pid = Process.fork do
puts "child, pid #{Process.pid} sleeping..."
sleep 5
puts "child exiting"
end
puts "parent, pid #{Process.pid}, waiting on child pid #{pid}"
Process.wait
puts "parent exiting"
Ответ 3
В 1.9 вы можете использовать команду Process.spawn. См. Также http://en.wikibooks.org/wiki/Ruby_Programming/Running_Multiple_Processes
Ответ 4
Если вы счастливы использовать Threads, а не Processes, то что-то вроде этого может быть немного более масштабируемым для более чем одной вилки:
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 и ее ограничениях.
Только что отредактировано, чтобы исправить вопиющую ошибку (без задания задачи) и следовать рекомендациям @(Джейсон Кинг).
Ответ 5
Хорошей альтернативой fork/exec/spawn является драгоценный камень posix-spawn для Ruby 1.9: https://github.com/rtomayko/posix-spawn
Они сделали большую часть тяжелой работы, чтобы сделать ее более простой, эффективной и гибкой по сравнению с методами более низкого уровня.