我是纤维和 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 之外,该示例没有任何内容。
据我了解(并且不了解):
async_fetch 在调用 f.resume 之前一直处于阻塞状态。
f 是当前的 Fiber,它是在 EventMachine.run 块中创建的包装 Fiber。
async_fetch 将控制流返回给它的调用者?我不确定这是做什么的
为什么包覆光纤最后有恢复?光纤是否默认暂停?
在示例之外,我如何使用纤程来表示,发出一堆由键盘命令触发的请求?
例如:每次我输入一封信时,我都会向谷歌提出请求或其他什么?- 通常这需要一个线程,主线程会告诉并行线程为每个请求启动一个线程。:-\
我是并发/纤维的新手。但他们是如此有趣!
如果有人能回答这些问题,那将不胜感激!!!