LoginSignup
6
6

More than 5 years have passed since last update.

Ruby Process基礎まとめ

Last updated at Posted at 2015-11-25

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

6
6
0

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
  3. You can use dark theme
What you can do with signing up
6
6