MST

星途 面试题库

面试题:Ruby实现并发HTTP请求并处理响应

使用Ruby,借助合适的库(如Net::HTTP等)实现并发地发送多个HTTP POST请求到不同的URL,每个请求携带不同的参数,并处理每个请求的响应结果。要求代码具备良好的错误处理机制,描述实现思路并给出核心代码。
42.8万 热度难度
编程语言Ruby

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 选择并发库:Ruby 中可以使用 concurrent-ruby 库来实现并发操作。它提供了线程安全的并发结构和执行器,方便管理多个并发任务。
  2. 构建请求:使用 Net::HTTP 库来构建 HTTP POST 请求,为每个请求设置不同的 URL 和参数。
  3. 并发执行:将每个请求任务提交到线程池(ThreadPoolExecutor)中并发执行。
  4. 错误处理:在每个请求任务中捕获可能出现的异常,如网络错误、HTTP 状态码错误等,并对异常进行处理。
  5. 收集结果:收集每个请求任务的执行结果,无论是成功的响应还是错误信息。

核心代码

require 'net/http'
require 'uri'
require 'concurrent'

# 定义请求任务列表
requests = [
  { url: 'http://example.com/api1', params: { key1: 'value1' } },
  { url: 'http://example.com/api2', params: { key2: 'value2' } },
  { url: 'http://example.com/api3', params: { key3: 'value3' } }
]

# 创建线程池执行器
executor = Concurrent::ThreadPoolExecutor.new(
  min_threads: 5,
  max_threads: 10
)

# 存储每个请求任务的未来结果(Future)
futures = requests.map do |req|
  executor.post do
    begin
      uri = URI(req[:url])
      http = Net::HTTP.new(uri.host, uri.port)
      http.use_ssl = uri.scheme == 'https'
      response = http.post(uri.path, req[:params].to_query, 'Content-Type' => 'application/x-www-form-urlencoded')
      response
    rescue StandardError => e
      e
    end
  end
end

# 等待所有任务完成并收集结果
results = futures.map(&:value)

# 处理结果
results.each do |result|
  if result.is_a?(Net::HTTPResponse)
    puts "Request successful, status code: #{result.code}"
    puts "Response body: #{result.body}"
  else
    puts "Request failed: #{result.message}"
  end
end

# 关闭线程池执行器
executor.shutdown
executor.wait_for_termination