使用Thread实现并发处理HTTP请求
- 原理:
Thread
类允许创建和管理多个线程,每个线程可以独立执行一段代码,从而实现并发处理HTTP请求。
- 代码示例:
require 'net/http'
require 'uri'
urls = [
'http://example.com',
'http://example.org',
'http://example.net'
]
threads = urls.map do |url|
Thread.new do
uri = URI(url)
response = Net::HTTP.get(uri)
puts "Response from #{url}: #{response.length} bytes"
end
end
threads.each(&:join)
使用Fiber实现并发处理HTTP请求
- 原理:
Fiber
是一种轻量级的线程,它允许手动控制代码的执行流程,通过在不同的 Fiber
之间切换,实现类似并发的效果。
- 代码示例:
require 'net/http'
require 'uri'
urls = [
'http://example.com',
'http://example.org',
'http://example.net'
]
fibers = urls.map do |url|
Fiber.new do
uri = URI(url)
response = Net::HTTP.get(uri)
puts "Response from #{url}: #{response.length} bytes"
end
end
fibers.each(&:resume)
使用concurrent-ruby库实现并发处理HTTP请求
- 原理:
concurrent - ruby
库提供了更高级、易用的并发编程工具,如 ThreadPoolExecutor
,它管理一个线程池来执行任务,提高资源利用率和效率。
- 代码示例:
require 'net/http'
require 'uri'
require 'concurrent'
urls = [
'http://example.com',
'http://example.org',
'http://example.net'
]
executor = Concurrent::ThreadPoolExecutor.new(
min_threads: 3,
max_threads: 3
)
futures = urls.map do |url|
executor.post do
uri = URI(url)
Net::HTTP.get(uri)
end
end
futures.each do |future|
response = future.value
puts "Response: #{response.length} bytes"
end
executor.shutdown
executor.wait_for_termination