Рубин и Форкинг - PullRequest
       2

Рубин и Форкинг

1 голос
/ 25 декабря 2010

Быстрый вопрос по поводу разветвления Ruby - я наткнулся на немного разветвленного кода в Resque ранее, который был чертовски сексуален, но меня несколько опрокинуло.

Я надеюсь, что кто-нибудь расскажет мне немного подробнее о том, что здесь происходит.В частности - может показаться, что разветвление порождает ребенка (ожидаемый) и пинает его прямо в «чужую» сторону моего состояния (менее ожидаемого. Это ожидаемое поведение? Идиома Ruby?

Мой взлом IRB здесь:

def fork
  return true if @cant_fork

  begin
    if Kernel.respond_to?(:fork)
      Kernel.fork
    else
      raise NotImplementedError
    end
  rescue NotImplementedError
    @cant_fork = true
    nil
  end
end

def do_something
  puts "Starting do_something"

  if foo = fork
    puts "we are forking from #{Process.pid}"
    Process.wait
  else
    puts "no need to fork, let's get to work: #{Process.pid} under #{Process.ppid}"
    puts "doing it"
  end
end

do_something

1 Ответ

4 голосов
/ 25 декабря 2010

Так работает вилка. Из документации:

В противном случае вызов fork дважды, один раз в родителе, возвращая идентификатор процесса ребенка и один раз у ребенка, возвращающего ноль.

Итак, у вашего родителя foo = fork - это PID дочернего элемента, а у потомка foo = fork - nil, поэтому он принимает ветвь else у дочернего элемента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...