EventMachine,为什么要从main运行所有I / O?

时间:2013-10-05 05:22:54

标签: ruby eventmachine

我听说应该从主线程调用所有I / O,而不是从任何其他线程调用(延迟)。有人可以解释为什么会这样吗?

我从未在文档中阅读过任何相关内容。来自PeepCode的EventMachine截屏视频以及此截屏视频:http://confreaks.com/videos/555-scotlandruy2011-introduction-to-eventmachine-and-evented-programming (虽然没有解释)

1 个答案:

答案 0 :(得分:1)

编写EM是为了通过在反应器线程中运行所有操作来绕过线程安全问题。

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似乎不再维持了