为什么在Ruby Event Machine中使用线程?

问题描述 投票:4回答:2

由于事件机器被认为是基于事件的模型异步I / O库(如node.js),它是单线程的并且使用事件循环来处理并发请求,所以真的有必要关心并在ruby应用程序上使用线程层代码(即处理请求时的rails控制器)?

我更习惯于node.js模型,你实际上只是将你的代码包装在回调中,然后一切都由你来处理。 (生成新线程的select()系统调用kqueue,epoll等在较低级别的C ++实现中处理),而ECMAscript本质上也没有线程。

最近我在尝试了解Event Machine时看到了这段红宝石代码:

Thread = Thread.current
Thread.new{ 
   EM.run{ thread.wakeup }
}
# pause until reactor starts
Thread.stop

我很好奇何时在ruby环境中使用基于事件的编程范例中的线程以及需要我们使用它们的具体情况。

我知道ruby在语言中内置了线程(MRI绿色线程,JRuby JVM线程),因此使用线程可能很诱人?但是,从我的观点来看,如果你真的不应该在更高级别的应用程序代码中担心它们,那么它会破坏整个目的,因为基于事件的模型几乎被引入来解决这个问题。

谢谢。感谢任何答案/澄清。

ruby-on-rails ruby multithreading asynchronous eventmachine
2个回答
2
投票

在使用EventMachine时,你不能拥有一个cpu密集型任务,因为你在任务上花费的时间被从反应堆中“带走”,当我知道一个任务时,我会使用线程:

  • 阻塞(你永远不应该阻止eventmachine线程)
  • 使用比我的平均任务更多的CPU

在这些情况下,在单独的线程中生成任务允许它完成其工作而不会阻止反应器自己完成工作。

另一种选择是使用另一种不同的野兽纤维。


1
投票

据我所知,线程和状态机之间的最大区别在于线程将利用多核处理器进行真正的并行处理,而状态机则以串行方式处理所有内容。另一方面,状态机更容易维护数据完整性,因为您不必过多担心竞争条件。

© www.soinside.com 2019 - 2024. All rights reserved.