Использование методов управления процессами Unix в Ruby

StackOverflow https://stackoverflow.com/questions/1604821

Вопрос

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

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

У меня есть немного кода (a 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
Это было полезно?

Решение

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

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

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

Другие советы

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

scroll top