Использование методов управления процессами Unix в Ruby - PullRequest
10 голосов
/ 22 октября 2009

Райан Томайко вызвал настоящую огненную бурю с этим сообщением об использовании команд управления процессами Unix.

Мы должны делать больше этого. Многое из этого. Я говорю о fork (2), execve (2), pipe (2), socketpair (2), select (2), kill (2), sigaction (2) и так далее и так далее. Это наши друзья. Они так сильно хотят просто помочь нам.

У меня есть немного кода (клон delayed_job для DataMapper, который, я думаю, вполне подойдет для этого, но я не совсем понимаю, как воспользоваться перечисленными командами. Есть идеи, как это улучшить? код

def start
  say "*** Starting job worker #{@name}"
  t = Thread.new do
    loop do
      delay = Update.work_off(self)
      break if $exit
      sleep delay
      break if $exit
    end
    clear_locks
  end

  trap('TERM') { terminate_with t }
  trap('INT')  { terminate_with t }

  trap('USR1') do
    say "Wakeup Signal Caught"
    t.run
  end
end

Ответы [ 2 ]

3 голосов
/ 23 октября 2009

Ах, да ... опасности "Мы должны сделать больше этого", не объясняя, что каждый из них делает и при каких обстоятельствах вы будете их использовать. Для чего-то вроде delayed_job вы можете даже использовать fork, даже не зная, что вы используете fork. Тем не менее, это действительно не имеет значения. Райан говорил о том, чтобы использовать fork для предварительной подкачки серверов. delayed_job будет использовать fork для превращения процесса в демона. Тот же системный вызов, разные цели. Запуск delayed_job на переднем плане (без fork) по сравнению с фоном (с fork) приведет к незначительной разнице в производительности.

Однако, если вы напишете сервер, который принимает одновременные соединения, теперь совет Райана прав:

  • fork: создает копию исходного процесса
  • execve: прекращает выполнение текущего файла и начинает выполнение нового файла в том же процессе (очень полезно для задач rake)
  • pipe: создает канал (два файловых дескриптора, один для чтения, один для записи)
  • socketpair: как труба, но для розеток
  • select: давайте подождем, пока один или несколько дескрипторов файлов будут готовы с таймаутом
  • kill: используется для отправки сигнала процессу
  • sigaction: позволяет изменить то, что происходит, когда процесс получает сигнал
1 голос
/ 28 марта 2010

5 месяцев спустя вы можете посмотреть мое решение на http://github.com/antarestrader/Updater. Посмотрите на lib / updater / fork_worker.rb

...