0

Rails開発にNetbeans7.0の使用を開始しようとしていますが、最新のrubyプラグインを使用しています。記録のために、デフォルトの1.8.7インタープリターをローカルの1.9.2ルビーインストールを指すように切り替えましたが、この問題は両方のインタープリターで発生するようです。

ルビーが私のコードでエラーに遭遇すると、エラー出力は私のコンソール出力のランダムなポイントに表示されます。発生したエラーを出力することを期待していましたが、エラーストリームと通常の出力ストリームが異なるスレッドで更新されているようです。例を挙げると...このコードで:

(0..10).each { |o| puts "Normal output" }
invalidSytax!

2行目で構文エラーをトリガーしていますが、エラー出力は異なる場合があります。例えば:

Normal output
Normal output
Normal output
~/LearnRuby/lib/ch1_ex2.rb:41:in `<main>': undefined method `invalidSytax!' for main:Object (NoMethodError)
Normal output
Normal output
Normal output
Normal output
Normal output
Normal output
Normal output
Normal output

と...

~/LearnRuby/lib/ch1_ex2.rb:41:in `<main>': undefined method `invalidSytax!' for main:Object (NoMethodError)
Normal output
Normal output
Normal output
Normal output
Normal output
Normal output
Normal output
Normal output
Normal output
Normal output
Normal output

これを引き起こしている可能性のあるアイデアはありますか?より大きなプロジェクトでは、コードに問題はないと思うかもしれませんが、コンソールストリームの最初に出力されるエラーメッセージが実際にある場合、これは大きな問題であることがわかりました。

4

1 に答える 1

0

これは、NetBeans の STDOUT と STDERR の内部処理のためです。出力は決定論的ではありません。すでにお察しのとおり、これらは両方とも 2 つの別々のスレッドで処理されると思います。したがって、ここで競合状態を目撃する可能性が最も高いです。

しかし、これは Ruby を使用しているかどうかに関係なく発生します。たとえば、Java プロジェクトで JUnit テストを実行すると、同じことが起こり、STDERR と STDOUT の出力が不確定に混合されます。

なぜこれが問題だと正確に考えるのですか?出力が意味不明に混ざらない限り (これは、両方のスレッドが同時に NetBeans のコンソールに書き込もうとして、適切なロック メカニズムが設定されていない場合に発生します)、なぜこれが問題になるのかわかりません。

Web アプリケーションのログ ファイルでも同じ原則が見られます。多数のクライアント接続が同時に情報をファイルに記録しようとすると、メッセージが表示される順序を予測できなくなります。私の意見では、動作はマルチスレッド アプリケーションに固有のものです。

于 2011-07-11T00:47:16.500 に答える