Processとは
プロセスを管理するためのモジュール
デーモンプロセスを生成したり、操作したりできる。
また、子プロセスを複数用意して、時間のかかる処理を複数のプロセスで処理することができる。
子プロセスの生成
子プロセスは親プロセスのコピーとして始まる。
スレッドとは違いメモリは共有されないため、親プロセスと子プロセスで値は共有されない。
ブロック有り(process_01.rb)
pid = Process.fork {
puts 'From child process'
}
ブロック無し(process_02.rb)
pid = Process.fork
if pid
# 親プロセスの処理
puts "forked: #{$$}"
else
# 子プロセスの処理
puts 'From child process'
end
Result(process_02.rb)
% ruby process_02.rb
forked: 12080
From child process
子プロセスの待ち合わせ
子プロセスの終了前に親プロセスが終わると孤児になる。
いくつかある待ち合わせメソッドを使いましょう。
waitpid
pid = Process.fork {
#
sleep 2
}
p Process.waitpid pid
- waitpid → 指定のpidの終了をまつ
- wait → 子プロセスのどれかが終了するのを待つ
- waitall → 全子プロセスが終了するのを待つ
プログラムのデーモン化
デーモンは,LinuxやUNIXにおいてメモリ上に常駐して様々なサービスを提供するプロセスを指します。 デーモンプロセスは処理要求を待ち続け,要求があると自分自身をコピーしたプロセスを作り,コピーしたプロセスに処理を実行させます。デーモンの意味は,悪魔の「demon」ではなく守護神の「daemon」です。
参考:デーモンとは?
e.g.)現在時刻を返すサーバ
require 'socket'
Process.daemon
TCPServer.open 'localhost', 4423 do |server|
loop do
client = server.accept
client.puts Time.now
client.clone
end
end
Result
% telnet localhost 4423
Trying ::1...
Connected to localhost.
Escape character is '^]'.
2015-10-29 01:14:54 +0900