RubyのProcess.detachを学ぶ
タイトルの通り。
マルチプロセスなEchoサーバーをRubyで書く際に、なるべくRubyの便利機能を排除して書きたかった。
Echoサーバー程度だとそもそも規模が小さいのでほぼ問題なく書けるのだが、子プロセスの扱いだけを悩んでしまった。
特に子プロセスの終了を親側で待つ必要が無いが、子プロセスの状態を回収しないとゾンビプロセスが発生してしまう。
ゾンビプロセスが湧くのはプロセスを見たときにイマイチなので回避したい。 そんなときにRubyの便利機能 Process.detach
を見つけた。
どんな方法で実現されているのか?を知りたいのでコードを見ることにする。
サーッと、 Rubyの process.c
というファイルを眺めていると、proc_detach
が Process.detach
の実装に相当していそう。
色々とコメントが付いている。
https://github.com/ruby/ruby/blob/trunk/process.c#L1132-L1175
雑に要約すると以下。
- マルチプロセスなプログラムで親プロセスが、子プロセスのステータスを回収しないと、子プロセスがゾンビになるよ
- それを防ぐために、
detach
ではメインのスレッドと、子プロセスを待つスレッドを分けるよ - 子プロセスを明示的に待つ必要がない時に利用してね
コメントにユースケースとかデザインとかがしっかり書き込まれているのは便利。