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