加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

请解释这个ruby光纤示例背后的逻辑

发布时间:2020-12-17 02:19:01 所属栏目:百科 来源:网络整理
导读:示例代码来自 here: def http_get(url) f = Fiber.current http = EventMachine::HttpRequest.new(url).get # resume fiber once http call is done http.callback { f.resume(http) } http.errback { f.resume(http) } return Fiber.yieldendEventMachine.
示例代码来自 here:

def http_get(url)
  f = Fiber.current
  http = EventMachine::HttpRequest.new(url).get

  # resume fiber once http call is done
  http.callback { f.resume(http) }
  http.errback  { f.resume(http) }

  return Fiber.yield
end

EventMachine.run do
  Fiber.new{
    page = http_get('http://www.google.com/')
    puts "Fetched page: #{page.response_header.status}"

    if page
      page = http_get('http://www.google.com/search?q=eventmachine')
      puts "Fetched page 2: #{page.response_header.status}"
    end
  }.resume
end

因此,在EM运行块的上下文中,作者创建了一个光纤并立即使用简历运行它.但是,我不明白为什么http_get逻辑以这种方式构造.我的意思是,它采用当前光纤(在这种情况下应该是在EM运行块中创建的光纤),它启动一个可能失败或成功的http请求,并恢复当前光纤.之后它只是在光纤上调用yield.自从他称之为收益后,究竟将会运行什么?有人可以解释为什么http_get的写法是这样的吗?

解决方法

>在EventMachine中创建并触发光纤
>目标是(a)获取页面和(b)对其进行处理
>应该暂停光纤直到获取页面,这是http_get的作用
> http = EventMachine :: HttpRequest.new(url).get不会触发任何事情:EventMachine需要重新获得缰绳,这就是Fiber.yield的作用
>一旦EventMachine完成了获取页面的工作,它就会触发回调并恢复在put处停止的光纤…

更清晰?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读