EM は、reactor スレッドですべての操作を実行することにより、スレッド セーフの問題を回避するために作成されました。
EM.defer
(Tread.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はもう維持されていないようです