0
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的 id 。但所有纤维对象的 id 都是相同的。我试过了,但结果也是一样的。 我在误解什么?该代码甚至是异步执行的吗?#1#2#3Thread.current.object_id

PS我正在使用ruby 2.0并且代码正在运行rails4

4

2 回答 2

1

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}"  ...
于 2013-07-22T08:10:44.933 回答
0

正如对存储库的搜索所示,em-http默认情况下不使用光纤。但是,该链接列出了一个示例,说明如果您愿意,可以如何使用纤维。

于 2013-07-26T22:36:14.967 回答