Ruby 如何在仍然提供对象接口的情况下创建异步HTTP请求?

Ruby 如何在仍然提供对象接口的情况下创建异步HTTP请求?,ruby,api,asynchronous,Ruby,Api,Asynchronous,在仍然允许进行异步HTTP请求的情况下,向HTTP API提供易于使用的对象样式接口的好方法是什么?例如,给定以下代码: user = User.find(1) # /api/v1/users/1 f = user.foo # /api/v1/users/1/foo b = user.bar # /api/v1/users/1/bar 对foo和bar方法的调用在逻辑上可以并行调用,但是如果可能的话,我想让调用用户有一个干净的方法来声明他们的并行调用意图,而不必深入底层HTTP库的细节 我不认

在仍然允许进行异步HTTP请求的情况下,向HTTP API提供易于使用的对象样式接口的好方法是什么?例如,给定以下代码:

user = User.find(1) # /api/v1/users/1
f = user.foo # /api/v1/users/1/foo
b = user.bar # /api/v1/users/1/bar
foo
bar
方法的调用在逻辑上可以并行调用,但是如果可能的话,我想让调用用户有一个干净的方法来声明他们的并行调用意图,而不必深入底层HTTP库的细节

我不认为无形地自动化并行化是一个好主意,这样调用代码就明确了它的期望。但是,我确实认为,对于前端开发人员来说,当他们知道一组请求彼此不依赖时,下面的块语法可能非常有用

# possible implementation?
user = User.find(1)
User.parallel do
  f = user.foo
  b = user.bar
end

这可能吗?如何使用Ruby 1.9.2实现这一点?

使用异步SQL的工作方式如下:

User.where(:id => 1).async_each do |user|
  Foo.where(:id => user.foo_id).async_each do |foo|
    # ... Do stuff with foo ...
  end
  Bar.where(:id => user.bar_id).async_each do |bar|
    # ... Do stuff with foo ...
  end
end
这是我对AsynchronousSequel的体验,它类似于ActiveRecord


请记住,这是大量回调叠加在一起,因此如果您不小心,事情可能会变得不正常。

透明并行化通常通过一种称为未来的方式来完成。在ruby中,lazy和promise Gem都实现了futures。以下是promise gem的一个示例:

require 'future'
user = User.find(1)
f = future{user.foo}
b = future{user.bar}
future将在后台线程的一个块中运行计算,任何对f或b进行操作的尝试都将被阻止,除非后台线程已经运行到完成


作为一个库设计师,只要你的库是线程安全的,这在很多情况下都应该是好的,尽管它在ruby中的伸缩性可能不太好。

我选择了研究赛璐珞宝石,谢谢!