没有第三方库,Ruby是否支持非阻塞HTTP请求?

时间:2015-06-17 18:02:36

标签: ruby http asynchronous gem eventmachine

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

我对Ruby很新,但在Java中我会提供一个异步API来返回响应的Futures。在JavaScript中,我会在我的方法中进行回调。

我已经搜索了其他Stack Overflow问题,https://github.com/eventmachine/em-http-request似乎做了我想要的事情。但是,我对依赖第三方库犹豫不决。是否有Ruby本地方法来解决这个问题,或者大多数开发人员是否依赖第三方库?

1 个答案:

答案 0 :(得分:3)

根据我的测试,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)