ruby - 异步发出多个 HTTP 请求

标签 ruby concurrency asynchronous fiber

require 'net/http'

urls = [
  {'link' => 'http://www.google.com/'},
  {'link' => 'http://www.yandex.ru/'},
  {'link' => 'http://www.baidu.com/'}
]

urls.each do |u|
  u['content'] = Net::HTTP.get( URI.parse(u['link']) )
end

print urls

此代码以同步方式工作。第一个请求,第二个,第三个。我想异步发送所有请求并在所有请求完成后打印 urls

最好的方法是什么? Fiber 适合吗?

最佳答案

一年多后我才看到这个,但希望对某些 googler 来说还不算太晚......

Typhoeus迄今为止最好的解决方案。它以非常优雅的方式包装 libcurl。您可以将 max_concurrency 设置为大约 200 而不会阻塞。

关于超时,如果您向 Typhoeus 传递一个 :timeout 标志,它只会将超时注册为响应...然后您甚至可以将请求放回另一个 hydra 中尝试如果你愿意,再来一次。

这是用 Typhoeus 重写的程序。希望这对以后遇到此页面的任何人有所帮助!

require 'typhoeus'

urls = [
  'http://www.google.com/',
  'http://www.yandex.ru/',
  'http://www.baidu.com/'
]

hydra = Typhoeus::Hydra.new

successes = 0

urls.each do |url|
    request = Typhoeus::Request.new(url, timeout: 15000)
    request.on_complete do |response|
        if response.success?
            puts "Successfully requested " + url
            successes += 1
        else
            puts "Failed to get " + url
        end
    end
    hydra.queue(request)
end

hydra.run 

puts "Fetched all urls!" if successes == urls.length

关于ruby - 异步发出多个 HTTP 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2128320/

相关文章:

ruby-on-rails - 没有路由匹配 service-worker.js

ruby-on-rails - 将数据库更改为 Postgres,现在 Rspec 抛出错误 : can't find object by id

multithreading - 并发 Haskell 是否仍仅限于单个操作系统线程?

scala - 在 "Dispatch"库中等待超时响应

Angular - 知道模板渲染何时完成 - 使用异步管道

ruby-on-rails - 将 ruby​​ 参数合并到字符串中会引发错误的 url 错误

java - 乐观锁定和 org.hibernate.StaleObjectStateException :

c++ - 如何将 std::future<T> 转换为 std::future<void>?

asynchronous - 使用 Proc::Async 从绑定(bind)管道中读取

Ruby:如何将外部循环设为 'next'?