首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Ruby的Fiber实现并行任务?

如何使用Ruby的Fiber实现并行任务?
EN

Stack Overflow用户
提问于 2016-04-22 22:35:56
回答 1查看 787关注 0票数 3

我对光纤和EventMachine还很陌生,直到最近我才发现了纤维,当时我还在查看Ruby是否有类似go-lang这样的并发特性。

当你使用纤维的时候,似乎并没有很多实际用例的例子。

我确实找到了这个:https://www.igvita.com/2009/05/13/fibers-cooperative-scheduling-in-ruby/ (追溯到2009年!)

它有以下代码:

代码语言:javascript
复制
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

太好了,异步获取请求!耶!但是..。我如何真正异步地使用它?除了创建包含的光纤之外,这个示例没有别的东西。

根据我所理解的(但不理解):

async_fetch正在阻塞,直到调用f.resume为止。

F是当前光纤,它是在EventMachine.run块中创建的包裹光纤。

async_fetch将控制流返回给其调用方?我不知道这是怎么回事

为什么包裹纤维在最后会恢复呢?纤维在默认情况下会暂停吗?

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

例如:每次我输入一个字母时,我都会向google或什么东西发出请求?-通常这需要一个线程,主线程会告诉并行线程为每个请求启动一个线程。*-\

我对并发/纤维还不熟悉。但它们太吸引人了!

如果有人能回答这些问题,那将是非常感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-23 07:32:08

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

在我看来,“纤维”这个名字类似于“线程”,这是造成混乱的原因。

如果您想要真正的并发性,即在所有可用的CPU之间分配CPU负载,那么您有以下选项:

中的应用

运行多个Ruby (即操作系统进程)、使用fork等。即使在Ruby中有多个线程,GIL (Global解释器Lock)也可以防止Ruby运行时使用超过一个CPU。

In JRuby

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36804333

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档