MST

星途 面试题库

面试题:Ruby爬虫中如何处理HTTP请求的并发

在使用Ruby构建高性能爬虫时,经常需要处理多个HTTP请求。请描述如何使用Ruby的并发机制(如Thread、Fiber或concurrent - ruby库)来并发处理HTTP请求,以提高爬虫的效率。并给出一个简单的代码示例,说明如何实现并发请求并处理响应。
14.5万 热度难度
编程语言Ruby

知识考点

AI 面试

面试题答案

一键面试

使用Thread实现并发处理HTTP请求

  1. 原理Thread 类允许创建和管理多个线程,每个线程可以独立执行一段代码,从而实现并发处理HTTP请求。
  2. 代码示例
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请求

  1. 原理Fiber 是一种轻量级的线程,它允许手动控制代码的执行流程,通过在不同的 Fiber 之间切换,实现类似并发的效果。
  2. 代码示例
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请求

  1. 原理concurrent - ruby 库提供了更高级、易用的并发编程工具,如 ThreadPoolExecutor,它管理一个线程池来执行任务,提高资源利用率和效率。
  2. 代码示例
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