Подтвердить что ты не робот

Как вы создаете дочерний процесс в Ruby?

Я хочу разгрузить блок кода в моем основном процессе для дочернего процесса, чтобы он запускался одновременно. Я также хочу иметь PID порожденного дочернего процесса, чтобы я мог контролировать и убивать его, если это необходимо.

4b9b3361

Ответ 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"

Ответ 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

Они сделали большую часть тяжелой работы, чтобы сделать ее более простой, эффективной и гибкой по сравнению с методами более низкого уровня.