Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 为什么在Ruby事件机中使用线程?_Ruby On Rails_Ruby_Multithreading_Asynchronous_Eventmachine - Fatal编程技术网

Ruby on rails 为什么在Ruby事件机中使用线程?

Ruby on rails 为什么在Ruby事件机中使用线程?,ruby-on-rails,ruby,multithreading,asynchronous,eventmachine,Ruby On Rails,Ruby,Multithreading,Asynchronous,Eventmachine,由于事件机被称为基于事件的模型异步I/O库(如node.js),它是单线程的,并使用事件循环来处理并发请求,那么在ruby应用层代码(即处理请求时使用rails控制器)上是否真的需要关注和使用线程呢 我更习惯于node.js模型,在这个模型中,您实际上只需将代码包装在回调中,然后一切都会为您处理好。(对生成新线程的KQueLead、ePoice等的调用(系统调用)在较低级别的C++实现中处理),而且EcMAScript的本质也没有线程。 最近,我在尝试了解事件机时看到了这段ruby代码: Thr

由于事件机被称为基于事件的模型异步I/O库(如node.js),它是单线程的,并使用事件循环来处理并发请求,那么在ruby应用层代码(即处理请求时使用rails控制器)上是否真的需要关注和使用线程呢

我更习惯于node.js模型,在这个模型中,您实际上只需将代码包装在回调中,然后一切都会为您处理好。(对生成新线程的KQueLead、ePoice等的调用(系统调用)在较低级别的C++实现中处理),而且EcMAScript的本质也没有线程。 最近,我在尝试了解事件机时看到了这段ruby代码:

Thread = Thread.current
Thread.new{ 
   EM.run{ thread.wakeup }
}
# pause until reactor starts
Thread.stop
我只是好奇ruby环境中基于事件的编程范式何时使用线程,以及在什么特定情况下需要使用线程

我知道ruby在语言中内置了线程(MRI绿色线程、JRuby JVM线程),所以使用线程很有诱惑力?然而,从我的观点来看,如果在更高级别的应用程序代码中实际上不需要担心它们,那么它就有点违背了整个目的,因为基于事件的模型基本上是用来解决这个问题的


谢谢。感谢您的回答/澄清

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

使用EventMachine时,您不能有cpu密集型任务,因为您在任务上花费的时间从反应器中“带走”,我在知道任务将要:

  • 正在阻止(您不应该阻止eventmachine线程)
  • 比我的平均任务使用更多的cpu
在这些情况下,在单独的线程中生成任务允许它完成自己的工作,而不会阻止反应器完成自己的工作


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

作为旁注;小心你的语法。使用大写,您可以使用
线程
类的实例有效地覆盖
线程
类。然后,您将无法再像在
第2行
之后的
第1行
上那样调用预期的方法,例如
new