我是光纤和EventMachine的新手,直到最近才发现Ruby是否具有任何并发功能(例如go-lang)时才发现有关光纤的知识。
对于使用Fiber的实际用例,似乎没有很多示例。
我确实设法找到了这个: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请求!耶!!!但是...我实际上如何异步使用它?该示例除了创建包含的Fiber之外没有任何其他内容。
据我了解(不了解):
在调用f.resume之前,async_fetch一直处于阻塞状态。
f是当前的Fiber,它是在EventMachine.run块中创建的包装Fiber。
async_fetch将控制流返回给它的调用者?我不确定这是做什么的
包裹的纤维为什么最后会恢复呢?默认情况下是否暂停纤维?
在示例之外,我该如何使用纤维来表达,触发由键盘命令触发的一堆请求?
例如,例如:每次我输入字母时,我都会向Google发送请求?-通常这需要一个线程,主线程将告诉并行线程为每个请求启动一个线程。:-\
我是并发/ Fiber的新手。但是他们很有趣!
如果有人可以回答这些问题,将不胜感激!!!
关于Ruby中的纤维有很多困惑。光纤不是实现并发的工具;它们仅仅是以一种可以更清楚地表示正在发生的事情的方式来组织代码的方式。
在我看来,“纤维”的名称类似于“线程”,这加剧了混乱。
如果要实现真正的并发性,即在所有可用CPU上分配CPU负载,则可以使用以下选项:
在MRI Ruby中
使用fork等运行多个Ruby VM(即OS进程)。即使在Ruby中具有多个线程,GIL(全局解释器锁)也可以防止Ruby运行时使用多个CPU。
在JRuby中
与MRI Ruby不同,JRuby在分配线程时将使用多个CPU,因此您可以获得真正的并发处理。
如果您的代码大部分时间都在等待外部资源,那么您可能不需要这种真正的并发性。MRI线程或某种事件处理循环可能对您来说很好。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句