我听说所有 I/O 都应该从主线程调用,而不是从任何其他线程(延迟)调用。有人可以解释为什么会这样吗?
我从未在文档中读过任何有关此的内容。来自 PeepCode 的 EventMachine 截屏视频提到了这一点,以及这个截屏视频:http ://confreaks.com/videos/555-scotlandruy2011-introduction-to-eventmachine-and-evented-programming (虽然都没有解释)
我听说所有 I/O 都应该从主线程调用,而不是从任何其他线程(延迟)调用。有人可以解释为什么会这样吗?
我从未在文档中读过任何有关此的内容。来自 PeepCode 的 EventMachine 截屏视频提到了这一点,以及这个截屏视频:http ://confreaks.com/videos/555-scotlandruy2011-introduction-to-eventmachine-and-evented-programming (虽然都没有解释)
编写 EM 是为了通过在反应器线程中运行所有操作来规避线程安全问题。
EM.defer
(Tread.new
真的)通过将代码执行的某些部分从主线程(反应器)切换到远离这个设计原则,但是您仍然应该仅通过在反应器中执行的 errback 和回调块与反应器交互,不是在单独的线程中执行的代码块(供Thread.new
人们使用EM.next_tick
以获得相同的效果)。
更简短的解释是,EM 不是线程安全的 :) 这就是为什么你不应该从其他线程调用 EM 的东西(如果你这样做,你需要能够处理同步)。
EM Docs 说的和他们说的一样多:
是的,但是如果您从不同的线程执行 EM::connect,那么它可能会引发未绑定的错误。为避免这种情况,请将您的 EM::connect 内容放入 next_tick 调用中。
...并且未绑定的错误只是最可能的结果(我已经看到了从块、空值到无异常不执行的所有内容...),如果您认为可以,任何数量的讨厌的线程不安全问题都一定会发生不假思索地与反应堆交互,https://github.com/eventmachine/eventmachine/wiki/FAQ#does-em-work-with-other-ruby-threads-running
还有一条建议,看看赛璐珞,EM好像不再维护了