4

Spawn を使用するために、Ruby on Rails サーバー (Linux で実行中) の並行処理を少しリファクタリングしています。Spawn::fork_itドキュメントは、分離された後も、フォークされたプロセスを待機できると主張しています: https://github.com/tra/spawn/blob/master/lib/spawn.rb (186行目):

# detach from child process (parent may still wait for detached process if they wish)
Process.detach(child)

ただし、Ruby のProcess::detachドキュメントには、これを行うべきではないと書かれています: http://www.ruby-doc.org/core/classes/Process.html

一部のオペレーティング システムは、親がそのステータスを収集するまで、終了した子プロセスのステータスを保持します (通常、wait( のバリアントを使用)。親がこのステータスを収集しない場合、子プロセスはゾンビ プロセスとして残ります。Process::detach は、終了時にプロセス pid のステータスを取得することを唯一の仕事とする個別の Ruby スレッドを設定する子プロセスの終了を明示的に待機するつもりがない場合にのみ、detach を使用してください。

しかし、Spawn::wait効果的にラップすることでそれを行うことができますProcess::waitProcess::waitpid2ちなみに、メソッドを使用する代わりに、メソッドを使用して子プロセスを待機することを特に望んでいますSpawn::wait

デタッチ アンド ウェイトは Linux で正しく動作しませんか? これにより、切り離された死神スレッドと待機中の親プロセスの間で、誰が最初に子ステータスを収集するかという競合状態が発生する可能性があることが懸念されます。

4

1 に答える 1

0

この質問に対する答えはドキュメントにあります。制御された環境で独自に使用するコードを書いていますか? それとも第三者によって広く使用されますか?Ruby はサード パーティによって広く使用されるように作成されているため、「一部のオペレーティング システム」で失敗する可能性のあることは行わないことをサード パーティは推奨しています。おそらく、Spawn ライブラリは主に Linux マシンで使用するために設計されており、この戦術が機能するその小さなサブセットでのみテストされています。

書いているコードを誰でも使えるように配布するのであれば、Ruby のアプローチを採用します。

このコードが実行される環境を制御する場合、次の 2 つのテストを記述します。

  1. プロセスを生成し、切り離してから待機するテスト。
  2. プロセスを生成し、それを待つだけのテスト。

両方の失敗率を数えて、それらが等しい場合 (許容できると思われるマージン内)、それを実行してください!

于 2012-06-21T22:00:47.950 に答える