search
LoginSignup
5

More than 5 years have passed since last update.

posted at

updated at

Organization

Ruby Process基礎まとめ

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

参考

パーフェクトRuby

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
5