Gem 学习 EventMachine 遇到的问题

zouchaoge · 2016年04月07日 · 最后由 zouchaoge 回复于 2016年04月07日 · 2002 次阅读

背景:需要在一次请求同时获取两个系统的结果,因此需要调用 2 个接口,因此增加了请求的耗时,因此想用 em 来解决这个问题: 问题 1:em 是否适用于此场景? 问题 2:为何 EM.stop 之后会导致 rails server 也跟着退出?难道应该不写 EM.stop 吗? 问题 3:如何解决这个异步问题?问题详情见代码注释:

def multi_request(request_info)
  result = { }
  EventMachine.run do
    multi = EventMachine::MultiRequest.new
    request_info.each do |index, value|
      multi.add index.to_sym, EventMachine::HttpRequest.new(value[:url]).post(body: value[:body])
    end

    multi.callback do
      result[:callback] = multi.responses[:callback]
      puts "In EM: #{result.inspect}" # 这里的输出会在最后才打印出来
      logger_format(multi.responses[:errback]) if multi.responses[:errback].present?
      EventMachine.stop
    end
  end
  p result # 会先前面的puts打印出来东西 #=> {}
  result_format(result)
end

各位大牛,小牛帮小弟分析一下呗

  1. 个人感觉不太适合,倒不如自己起线程,或是采用 parallel
  2. 你的 Rails 服务器是 thin 吧?这个是基于 EventMachine 的,你直接 stop 的话,服务器也会同时 stop 掉
  3. EventMachine 是异步 IO,执行 HTTP 请求时不会堵塞其他操作,所以 result 可能会先打印出来。解决方式之一与 Fiber 配合使用,可以使用采用此方案实现的 em-synchrony
需要 登录 后方可回复, 如果你还没有账号请 注册新账号