为什么我的eventmachine客户端代码不能异步工作?

时间:2013-07-22 07:57:58

标签: ruby multithreading asynchronous eventmachine fiber

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一起运行

2 个答案:

答案 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默认情况下不使用光纤。但是,该链接列出了一个如何使用光纤的例子。