如何用Ruby的Fibers实现并行任务?

我是光纤和EventMachine的新手,最近才发现有关光纤的信息,看看Ruby是否有任何并发​​功能,比如go-lang。

当你使用光纤时,似乎没有太多的实例用于实际使用情况。

我设法找到了这个:https://www.igvita.com/2009/05/13/fibers-cooperative-scheduling-in-ruby/(从2009年起回来!!!)

其中包含以下代码:

require 'eventmachine'
require 'em-http'
require 'fiber'

def async_fetch(url)
  f = Fiber.current
  http = EventMachine::HttpRequest.new(url).get :timeout => 10
  http.callback { f.resume(http) }
  http.errback { f.resume(http) }

  return Fiber.yield
end

EventMachine.run do
  Fiber.new{
    puts "Setting up HTTP request #1"
    data = async_fetch('http://www.google.com/')
    puts "Fetched page #1: #{data.response_header.status}"

    EventMachine.stop
  }.resume
end

这非常好,异步GET请求! 好极了!!! 但是......我如何实际使用它异步? 该示例除了创建包含光纤外没有其他任何内容。

根据我的理解(并且不理解):

async_fetch被阻塞直到f.resume被调用。

f是当前光纤,它是在EventMachine.run块中创建的环绕光纤。

async_fetch将控制流返回给调用者? 我不确定这是什么

为什么包装光纤在最后恢复? 光纤是否默认暂停?

在这个例子之外,我如何使用光纤来说出一些键盘命令触发的请求?

例如:每次我键入一封信,我都会向Google或Google提出请求? - 通常这需要一个线程,主线程会告诉并行线程为每个请求启动一个线程。 : -

我是新来的并发/光纤。 但他们非常耐人寻味!

如果任何人都可以回答这些问题,那将非常感谢!


Ruby中的纤维存在很多混淆。 纤维不是实现并发的工具; 它们只是一种组织代码的方式,可以更清楚地表示发生了什么。

在我看来,'纤维'这个名字与'线索'很相似,这有助于混淆。

如果您需要真正的并发性,即跨所有可用CPU分配CPU负载,则可以使用以下选项:

在MRI红宝石

运行多个Ruby VM(即OS进程),使用fork等。即使在Ruby中有多个线程,GIL(全局解释器锁)也会阻止Ruby运行时使用超过1个CPU。

在JRuby

与MRI Ruby不同,JRuby在分配线程时将使用多个CPU,因此您可以获得真正的并发处理。

如果您的代码花费大部分时间等待外部资源,那么您可能不需要这种真正的并发。 MRI线程或某种事件处理循环可能适合您。

链接地址: http://www.djcxy.com/p/79327.html

上一篇: How does one achieve parallel tasks with Ruby's Fibers?

下一篇: Why do people say that Ruby is slow?