使用Ruby并发web请求(Sinatra?)?

使用Ruby并发web请求(Sinatra?)?,ruby,concurrency,httpwebrequest,sinatra,Ruby,Concurrency,Httpwebrequest,Sinatra,我有一个Sinatra应用程序,它基本上接受一些输入值,然后从Flickr、Twitter等外部服务中查找与这些值匹配的数据 例如: 输入:“Chattanooga Choo Choo” 会在查塔努加Choo-Choo上找到Flickr上的图片和推特上的推特,等等 现在我有一些类似于: @images = Flickr::...find...images.. @tweets = Twitter::...find...tweets... @results << @images @

我有一个Sinatra应用程序,它基本上接受一些输入值,然后从Flickr、Twitter等外部服务中查找与这些值匹配的数据

例如:

输入:“Chattanooga Choo Choo” 会在查塔努加Choo-Choo上找到Flickr上的图片和推特上的推特,等等

现在我有一些类似于:

@images = Flickr::...find...images..

@tweets = Twitter::...find...tweets...

@results << @images

@results << @tweets
@images=Flickr::…查找…图像。。
@tweets=Twitter::…查找…tweets。。。
@结果是为什么不是

据我所知。用户提交表单后,您希望并行处理所有请求,对吗?您可以有一个多线程控制器(Ruby线程支持工作得非常好)。在这里,您收到一个请求,然后并行执行外部查询服务,然后在一个响应中回复,或者在客户端为每个服务发送一个ajax post并处理它(可能每个外部服务都有自己的控制器/操作?

是,为什么没有线程


据我所知,一旦用户提交表单,您就希望并行处理所有请求,对吗?您可以有一个多线程控制器(Ruby线程支持非常有效)如果您收到一个请求,然后并行执行外部查询服务,然后在一个响应中回复,或者在客户端为每个服务发送一个ajax帖子并对其进行处理(可能每个外部服务都有自己的控制器/操作?)线程可以工作,但这是一个粗糙的工具。您可以尝试以下方法:

flickr_thread = Thread.start do
  @flickr_result = ... # make the Flickr request
end

twitter_thread = Thread.start do
  @twitter_result = ... # make the Twitter request
end

# this makes the main thread wait for the other two threads
# before continuing with its execution
flickr_thread.join
twitter_thread.join

# now both @flickr_result and @twitter_result have
# their values (unless an error occurred)
不过,您必须对代码进行一些修改,并添加适当的错误检测。我现在不记得实例变量在线程块内声明时是否有效,除非在线程块外显式声明,否则局部变量不会有效

我不认为这是一个优雅的解决方案,但我认为它是可行的,而且也不太复杂。在这种情况下,幸运的是,除了连接之外,不需要锁定或同步,因此代码读起来非常好


如果你做了很多类似的事情,也许像这样的工具(特别是子项目)可能会对你有所帮助。它可能会使在更高级别上编写代码变得更容易。线程很难正确执行。

线程可以工作,但它是一个粗糙的工具。你可以尝试以下方法:

flickr_thread = Thread.start do
  @flickr_result = ... # make the Flickr request
end

twitter_thread = Thread.start do
  @twitter_result = ... # make the Twitter request
end

# this makes the main thread wait for the other two threads
# before continuing with its execution
flickr_thread.join
twitter_thread.join

# now both @flickr_result and @twitter_result have
# their values (unless an error occurred)
不过,您必须对代码进行一些修改,并添加适当的错误检测。我现在不记得实例变量在线程块内声明时是否有效,除非在线程块外显式声明,否则局部变量不会有效

我不认为这是一个优雅的解决方案,但我认为它是可行的,而且也不太复杂。在这种情况下,幸运的是,除了连接之外,不需要锁定或同步,因此代码读起来非常好


也许一个工具(特别是子项目)可能会帮助你,如果你做了很多这样的事情,它可能会使代码更容易在更高的层次上。线程很难得到正确的。

< P>你可以考虑让客户端改变使用异步Ajax请求来获得每种类型(图像,推特)。独立。服务器线程的问题(无论如何是其中一个)如果一个服务挂起,整个请求挂起等待线程完成。用Ajax,你可以加载一个图像部分,一个推特部分,等等,如果一个挂起,其他人仍然会显示他们的结果;最后你可以超时请求,并显示一个失败的鲸鱼或在这一节中的东西。客户端更改为使用异步Ajax请求独立地获取每种类型(图像、twitter)。服务器线程的问题(无论如何都是其中之一)如果一个服务挂起,整个请求将挂起,等待该线程完成。使用Ajax,您可以加载图像部分、twitter部分等,如果其中一个挂起,其他部分仍将显示其结果;最终您可以超时请求,并仅在该部分中显示失败鲸鱼或其他内容。

考虑为此使用YQL。它支持子查询,因此您可以通过一个(客户端,甚至)调用提取所需的所有内容,该调用只需从需要呈现的内容中吐出JSON。已经有很多教程了。

考虑使用YQL进行此操作。它支持子查询,因此您可以通过一个(客户端,甚至)调用提取所需的所有内容调用它只会从需要呈现的内容中吐出JSON。已经有很多教程了。

并行/并发http请求


并行/并发http请求

我支持这一点,只是每个服务有不同的url端点,然后用AJAXI调用所有这些端点。我支持这一点,只是每个服务有不同的url端点,然后用AjaxThank调用所有这些端点。我喜欢我尝试的方法。我会尝试一下。感谢everyone.谢谢。我喜欢我尝试的方法。我会尝试一下。谢谢大家。这是一个有趣的想法。我没有想到。请展开URL缩短链接。这是一个有趣的想法。我没有想到。请展开URL缩短链接。