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/