Использование методов управления процессами Unix в Ruby
Райан Томайко рассказал об этой статье об использовании команд управления процессами 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 ответа
Ах, да... опасности "Мы должны сделать больше этого", не объясняя, что каждый из них делает и при каких обстоятельствах вы будете их использовать. Для чего-то вроде delayed_job
Вы даже можете использовать fork
не зная, что вы используете fork
, Тем не менее, это действительно не имеет значения. Райан говорил об использовании fork
для preforking серверов. delayed_job
будет использовать fork
для превращения процесса в демона. Тот же системный вызов, разные цели. Бег delayed_job
на переднем плане (без fork
) против на заднем плане (с fork
) приведет к незначительной разнице в производительности.
Тем не менее, если вы напишите сервер, который принимает одновременные соединения, теперь совет Райана прямо на деньги.
fork
: создает копию исходного процессаexecve
: прекращает выполнение текущего файла и начинает выполнение нового файла в том же процессе (очень полезно в задачах rake)pipe
: создает канал (два файловых дескриптора, один для чтения, один для записи)socketpair
: как труба, но для розетокselect
: давайте подождем, пока один или несколько файловых дескрипторов будут готовы с тайм-аутомkill
: используется для отправки сигнала процессуsigaction
: позволяет изменить то, что происходит, когда процесс получает сигнал
Через 5 месяцев вы можете просмотреть мое решение по адресу http://github.com/antarestrader/Updater. Посмотрите на lib/updater/fork_worker.rb