Ruby 是否支持无第三方库的非阻塞 HTTP 请求?

Ada*_*dam 5 ruby asynchronous rubygems http eventmachine

我正在编写一个 API 来访问我的一台服务器上的资源。该 API 的一部分将发出 HTTP 请求。以良好软件设计的名义,我不希望我的 API 被阻塞。

我对 Ruby 相当陌生,但在 Java 中我会提供一个异步 API,它返回响应的 Future。在 JavaScript 中,我会在我的方法中进行回调。

我搜索了其他 Stack Overflow 问题,https://github.com/eventmachine/em-http-request似乎可以满足我的要求。但是,我对于是否依赖第三方库犹豫不决。Ruby 是否有原生方法来解决这个问题,或者大多数开发人员依赖第三方库?

Max*_*Max 5

根据我的测试,MRI 确实通过使用线程来支持非阻塞 HTTP 请求。由于 GIL,线程并不总是允许 Ruby 中的并行性,但net/http似乎是例外之一:

require 'net/http'
require 'benchmark'

uri = URI('http://stackoverflow.com/questions/30899019/')

n = 10
Benchmark.bm do |b|
  b.report { n.times { Net::HTTP.get(uri) } }
  b.report { threads = Array.new(n) { Thread.new { Net::HTTP.get(uri) } }; threads.each(&:join) }
end
#     user     system      total        real
# 0.010000   0.010000   0.020000 (  0.102024)
# 0.020000   0.010000   0.030000 (  0.025904)
Run Code Online (Sandbox Code Playgroud)