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
在此代码中,我希望在Fiber
,#1
,#2
行获得不同的#3
ID。但是所有的纤维物都是&#39; id是一样的。我试过了Thread.current.object_id
,但结果也是一样的。
我有什么误会?该代码甚至是异步执行的吗?
P.S我使用ruby 2.0
并且代码与rails4
一起运行
答案 0 :(得分:1)
http://ruby-doc.org/core-2.0/Fiber.html
光纤是实现轻量级合作的基本原则 Ruby中的并发性。基本上它们是创建代码的一种手段 可以暂停和恢复的块,就像线程一样。主要的 区别在于它们永远不会被抢占和调度 必须由程序员而不是VM完成。
您的代码中您在哪里安排光纤,例如调用Fiber.yield或my_fiber.resume?
当前()→光纤
返回当前光纤。 在使用此方法之前,您需要“纤维”。如果你不是 在光纤环境中运行此方法将返回根 纤维
您的代码中的哪些位置可以创建其他光纤,例如Fiber.new做......?
该代码甚至是异步执行的吗?
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}" ...
答案 1 :(得分:0)
正如search of the repository所示,em-http
默认情况下不使用光纤。但是,该链接列出了一个如何使用光纤的例子。