6

ハンドラオブジェクトを生成してを介して待機する前に、DRbサービスを起動するスクリプトがありますDRb.thread.join。明示的に強制終了されるまでスクリプトを実行したいので、追加しました

trap "INT" do
  DRb.stop_service
end

これはDRbサービスを正常に停止し、Ruby 1.8で終了しますが、1.9未満ではデッドロックしているようです(OS X 10.6.7)。プロセスをサンプリングすると、いくつかのスレッドがで回転していることがわかりsemaphore_wait_signal_trapます。

私は私が呼んstop_serviceでいる方法で何か間違ったことをしていると思いますが、私は何をしているのかわかりません。誰かが私にそれを正しく行う方法についての指針を教えてもらえますか?

4

2 に答える 2

6

さて、私は解決策を見つけたと思います。元のコードを

begin
  DRb.thread.join
rescue Interrupt
ensure
  DRb.stop_service
end

Ctrl-C が機能し、サービスを停止します。

于 2011-06-18T10:03:22.123 に答える
0

DRb.thread.join呼び出し元のスレッドにDRb実行スレッドの終了を待機させます。シグナルをキャッチしたい場合はINT、代わりに次のコードを使用します。

$execute = true
DRb.start_service

Signal.trap("INT") { $execute = false }
while $execute
  sleep 1
end
DRb.stop_service

この場合はないことに注意してくださいDRb.thread.join 。また、割り込み例外をレスキューする代わりに、シグナルをキャッチすることをお勧めします。

于 2012-04-29T09:04:59.780 に答える