我听说应该从主线程调用所有I / O,而不是从任何其他线程调用(延迟)。有人可以解释为什么会这样吗?
我从未在文档中阅读过任何相关内容。来自PeepCode的EventMachine截屏视频以及此截屏视频:http://confreaks.com/videos/555-scotlandruy2011-introduction-to-eventmachine-and-evented-programming (虽然没有解释)
答案 0 :(得分:1)
EM.defer
(任何Tread.new
真的)通过将代码执行的某些部分从主线程(反应堆)切换出来而脱离了这个设计原则,但你仍然应该与reactor只能通过在reactor中执行的errback和callback块,而不是在单独的线程中执行的代码块(Thread.new
人使用EM.next_tick
获得相同的效果)。
更简短的解释是, EM不是线程安全的 :)这就是为什么你不应该从其他线程调用EM的东西(如果你这样做,你需要能够处理同步)。
EM博士说,尽管如此,他们说的很多:是的,但是如果你从另一个线程做EM :: connect,那么它可能会 抛出未绑定的错误。为了避免这种情况,请将您的EM :: connect内容放入 next_tick call。
...并且未绑定的错误只是最可能的结果(我已经看到了所有来自块,nils,非执行的无异常,......),任何数量的讨厌的线程不安全问题都必然会发生,如果你假设你可以轻率地与反应堆互动,https://github.com/eventmachine/eventmachine/wiki/FAQ#does-em-work-with-other-ruby-threads-running
一条建议,看看赛璐珞,EM似乎不再维持了