来自EventMachine的多个异步回调 - 是否有更好的方法来处理它?

时间:2011-11-12 17:11:24

标签: ruby event-handling

我正在使用Ruby的EventMachine库从我正在编写的Ruby服务器异步访问外部RESTful API。我通过我的服务器提供的方法之一要求访问多个外部API,并在将响应返回到访问我的服务器的客户端之前聚合响应。这就是我现在正在做的事情......

def aggregate
  responses = Array.new
  done      = 0

  # clients are EM::Deferrable objects...
  clients.each do |client|
    client.callback do |response|
      responses << response
      done += 1
    end

    client.errback do |response|
      done += 1
    end
  end

  until done == clients.length
    sleep 1
  end

  return responses
end

有没有更好的方法来处理这种情况?是否有可能在EventMachine 1.0.0版本中提供的EM :: Completion类将提供更好地支持这种用例的管道?

我确定此问题已经出现过(尽管我在StackOverflow上找不到类似的问题),所以我很想知道其他人是如何处理这个问题的。

1 个答案:

答案 0 :(得分:3)

首先,使用睡眠完全违背了EventMachine的目的。你用它来阻止事件循环。我需要更大的图片来建议如何更好地做到这一点,但是你的代码应该习惯一个方法在所有请求完成之前返回的事实。或者看看em-synchrony,了解如何使用Ruby的光纤进行程序样式的规划编程(对你来说是透明的)。

减少胶水代码以并行运行多个请求的一种方法是使用em-http-requests multi interface之类的东西,它既可以使用EventMachine的回调方式,也可以用于em-synchrony。

另一方面,EM ::完成更多是延伸的Deferrable,在这种情况下不会完全帮助你。