ruby - 使用 Ruby(Sinatra?)的并发 Web 请求?

标签 ruby concurrency httpwebrequest sinatra

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

例如:

输入:“Chattanooga Choo Choo” 会出去在查塔努加 Choo Choo 上的 Flickr 上查找图片,在 Twitter 上查找推文等。

现在我有这样的东西:

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

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

@results << @images

@results << @tweets

所以我的问题是,在 Ruby 中是否有一种有效的方法来同时运行这些请求?而不是在推文完成之前等待图像完成。

最佳答案

Threads 可以工作,但它是一个粗糙的工具。你可以尝试这样的事情:

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)

不过,您必须稍微修改一下代码,并添加适当的错误检测。我现在不记得实例变量在线程 block 内声明时是否起作用,局部变量不会起作用,除非它们在外部显式声明。

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

也许像 EventMachine 这样的工具(特别是 em-http-request 子项目)可能会帮助你,如果你做了很多这样的事情。它可能会使更高级别的编码变得更容易。线程很难正确。

关于ruby - 使用 Ruby(Sinatra?)的并发 Web 请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2713740/

相关文章:

ruby-on-rails - 原子 rails 4 个窗口 64 位

ruby - 在 YAML 变量中包含 jekyll/liquid 模板数据?

haskell - 如何原子地修改可变数组中的值?

c# - 如何以编程方式登录到wordpress?

c# - 如何使用 Fiddler 调试来自任何应用程序(例如 C#/WPF 应用程序)的流量

ruby - 使用 Net::HTTP 和 Ruby 1.8.7 更改 ssl 版本

multithreading - 为什么当子程序很昂贵时多线程执行不起作用?

concurrency - 如何防止未交付的 promise 挂起?

windows-phone-7 - 如何在 Windows Phone 8 应用程序中为 httpwebrequest 设置超时?

ruby - OpenUri 和 OpenSSL 无法获取本地颁发者证书