1

すべての I/O は、他のスレッド (遅延) からではなく、メイン スレッドから呼び出す必要があると聞いたことがあります。誰かがなぜそうなのか説明できますか?

ドキュメントでそれについて何も読んだことがありません。PeepCode からの EventMachine スクリーンキャストは、これとこのスクリーンキャストについて言及しています: http://confreaks.com/videos/555-scotlandruy2011-introduction-to-eventmachine-and-evented-programming (どちらも説明なし)

4

1 に答える 1

1

EM は、reactor スレッドですべての操作を実行することにより、スレッド セーフの問題を回避するために作成されました。

EM.deferTread.new実際には)コード実行の一部をメインスレッド(リアクター)から切り替えることで、この設計原則から脱却しますが、リアクターで実行されるエラーバックとコールバックブロックを介してのみリアクターとやり取りすることになっています。別のスレッドで実行されるコードブロックではありません(Thread.new人々EM.next_tickが同じ効果を得るために)。

簡単に説明すると、EM はスレッドセーフではありません:) そのため、他のスレッドから EM を呼び出すべきではありません (そうする場合は、同期を処理できる必要があります)。

EMドキュメントは、彼らが言うほど多くは言わずに、同じくらい言います:

はい。ただし、別のスレッドから EM::connect を実行すると、バインドされていないエラーがスローされる場合があります。これを避けるには、EM::connect スタッフを next_tick 呼び出しに入れます。

...そして、バインドされていないエラーは最も可能性の高い結果です(ブロック、nil、例外なしの非実行など、すべてを見てきました...)。軽率にリアクターと対話するhttps://github.com/eventmachine/eventmachine/wiki/FAQ#does-em-work-with-other-ruby-threads-running

そしてアドバイスですが、セルロイドを調べてみてください。EMはもう維持されていないようです

于 2014-01-03T18:43:14.110 に答える