http://ruby-doc.org/core-2.0/Fiber.html
Fiber 是在 Ruby 中实现轻量级协作并发的原语。基本上,它们是一种创建可以暂停和恢复的代码块的方法,就像线程一样。主要区别在于它们永远不会被抢占,并且调度必须由程序员而不是 VM 来完成。
您在代码中的哪个位置安排纤程,例如调用 Fiber.yield 或 my_fiber.resume?
current() → Fiber
返回当前的光纤。在使用此方法之前,您需要使用“纤维”。如果您不在纤程的上下文中运行,则此方法将返回根纤程。
在您的代码中,您在哪里创建了额外的纤程,例如 Fiber.new do ...?
该代码甚至是异步执行的吗?
require 'em-http-request'
require 'fiber'
puts Fiber.current.object_id
def index
p "INDEX, #{Fiber.current.object_id}" # <- #1
EventMachine.run {
http = EventMachine::HttpRequest.new('http://google.com/').get :query => {'keyname' => 'value'}
http.errback { p "#{Uh oh}, #{Fiber.current.object_id}"; EM.stop } # <- #2
http.callback {
p "#{http.response_header.status}, #{Fiber.current.object_id}" # <- #3
p "#{http.response_header}"
p "#{http.response}"
EventMachine.stop
}
}
#render text: 'test1'
end
index()
--output:--
2157346420
"INDEX, 2157346420"
"301, 2157346420"
"{\"LOCATION\"=>\"http://www.google.com/?keyname=value\", \"CONTENT_TYPE\"=>\"text/html; charset=UTF-8\", \"DATE\"=>\"Mon, 22 Jul 2013 08:44:35 GMT\", \"EXPIRES\"=>\"Wed, 21 Aug 2013 08:44:35 GMT\", \"CACHE_CONTROL\"=>\"public, max-age=2592000\", \"SERVER\"=>\"gws\", \"CONTENT_LENGTH\"=>\"233\", \"X_XSS_PROTECTION\"=>\"1; mode=block\", \"X_FRAME_OPTIONS\"=>\"SAMEORIGIN\", \"CONNECTION\"=>\"close\"}"
"<HTML><HEAD><meta http-equiv=\"content-type\" content=\"text/html;charset=utf-8\">\n<TITLE>301 Moved</TITLE></HEAD><BODY>\n<H1>301 Moved</H1>\nThe document has moved\n<A HREF=\"http://www.google.com/?keyname=value\">here</A>.\r\n</BODY></HTML>\r\n"
没有。
这是一个错误:
http.errback { p "#{Uh oh}" ...