我正在使用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上找不到类似的问题),所以我很想知道其他人是如何处理这个问题的。
答案 0 :(得分:3)
首先,使用睡眠完全违背了EventMachine的目的。你用它来阻止事件循环。我需要更大的图片来建议如何更好地做到这一点,但是你的代码应该习惯一个方法在所有请求完成之前返回的事实。或者看看em-synchrony,了解如何使用Ruby的光纤进行程序样式的规划编程(对你来说是透明的)。
减少胶水代码以并行运行多个请求的一种方法是使用em-http-requests multi interface之类的东西,它既可以使用EventMachine的回调方式,也可以用于em-synchrony。
另一方面,EM ::完成更多是延伸的Deferrable,在这种情况下不会完全帮助你。