Help us understand the problem. What is going on with this article?

Ruby Process基礎まとめ

More than 5 years have passed since last update.

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

lifull
日本最大級の不動産・住宅情報サイト「LIFULL HOME'S」を始め、人々の生活に寄り添う様々な情報サービス事業を展開しています。
https://lifull.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away