面试题答案
一键面试使用Thread实现
- 实现方式:
- 在Ruby中,可以使用
Thread
类来创建新线程。示例代码如下:
require 'net/http' urls = ['http://example.com', 'http://example.org', 'http://example.net'] threads = [] urls.each do |url| threads << Thread.new do uri = URI(url) response = Net::HTTP.get(uri) puts "Fetched #{url}: #{response.length} bytes" end end threads.each(&:join)
- 这里为每个URL创建一个新的线程,每个线程独立发起HTTP请求并处理响应。
- 在Ruby中,可以使用
- 优点:
- 简单直观:
Thread
类的使用相对简单,符合常规的多线程编程思维,易于理解和实现。 - 并发执行:多个线程可以并发执行,在一定程度上提高了请求的效率,特别是在I/O密集型任务(如网络请求)中,可以充分利用CPU的空闲时间。
- 简单直观:
- 缺点:
- 资源消耗:每个线程都需要占用一定的系统资源(如栈空间),创建过多线程会导致资源浪费,甚至可能耗尽系统资源。
- 线程安全问题:如果多个线程访问共享资源,需要进行同步操作(如使用互斥锁
Mutex
),否则容易出现数据竞争和不一致的问题,增加了编程的复杂性。
使用Fiber实现
- 实现方式:
Fiber
是一种轻量级的协程。示例代码如下:
require 'net/http' urls = ['http://example.com', 'http://example.org', 'http://example.net'] fibers = [] urls.each do |url| fibers << Fiber.new do uri = URI(url) response = Net::HTTP.get(uri) puts "Fetched #{url}: #{response.length} bytes" end end fibers.each(&:resume)
- 这里为每个URL创建一个
Fiber
,Fiber
在调用resume
时开始执行。
- 优点:
- 轻量级:
Fiber
比线程轻量级得多,创建和销毁的开销小,适合创建大量并发任务。 - 避免线程安全问题:
Fiber
是协作式调度,同一时间只有一个Fiber
在执行,不需要像线程那样处理复杂的同步问题,编程相对简单。
- 轻量级:
- 缺点:
- 调度需要手动控制:
Fiber
需要手动调用resume
来启动执行,并且没有像线程那样的自动调度机制,在复杂场景下调度逻辑可能会变得复杂。 - 无法利用多核CPU:
Fiber
本质上是单线程执行,无法充分利用多核CPU的优势,在CPU密集型任务中效率可能不如多线程。
- 调度需要手动控制: