如何用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?