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

4
自从Event Machine被称为基于事件的模型异步I/O库(就像node.js一样),它是单线程的,使用事件循环来处理并发请求,因此是否真的有必要关心和在Ruby应用程序层代码(即处理请求的Rails控制器)中使用线程呢?
我更习惯Node.js模式,在其中实际上只需在回调函数中包裹代码,然后一切都会为您处理。(选择()系统调用到kqueue、epoll等产生新线程在较低级别的C++实现中处理),而且 ECMAscript 本质上也没有线程。
最近,当我试图了解Event Machine时,我看到了这段Ruby代码:
Thread = Thread.current
Thread.new{ 
   EM.run{ thread.wakeup }
}
# pause until reactor starts
Thread.stop

我很好奇在Ruby环境下,当事件驱动编程范式使用线程时,什么情况需要我们使用它们。我知道Ruby语言内置了线程(MRI green threads, JRuby JVM threads),所以使用线程可能是很诱人的。然而,从我的角度来看,如果你实际上不应该在更高级别的应用程序代码中担心它们,因为事件驱动模型基本上是为解决这个问题而引入的,那么这种方式有点违背了整个目的。感谢任何答案/澄清。

顺便提一下,要注意语法。使用大写字母,你实际上是在用 Thread 类的一个实例覆盖了 Thread 类本身。这样做后,你将无法再像在 line 2 之后的 line 1 中所做的那样调用预期的方法,例如 new - Volte
2个回答

2
当使用EventMachine时,不能有cpu密集型任务,因为您在任务上花费的时间会从反应器中"取走"。当我知道一个任务将要:
  • 阻塞 (您不应该阻止eventmachine线程)
  • 使用比我的平均任务更多的cpu

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

另一种选择是使用纤维,这是另一种不同的东西。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接