Ruby中使用Queue队列执行多线程任务

Posted by baicai on May 15, 2016

我们都知道啊,一个程序可能有多个进程组成,而一个进程也可以有多个线程并行运行。线程的并行运行,可以提高程序的运行效率,但也存在着很多的危险,可能出现多个线程抢占一个资源的情况。这里我们就以ruby为例来说一说线程在ruby当中的应用。</span></p>


在Ruby中,提供三种实现同步的方式,分别是:

1. 通过Mutex类实现线程同步</p>

2. 监管数据交接的Queue类实现线程同步</p>

3. 使用ConditionVariable实现同步控制


这里,介绍下Queue的使用:

Queue是thread标准库里的一个类。<br>


require 'thread'

queue = Queue.new
threads = []

# 添加工作单元,比如一堆下载列表,也可使用 queue.push(obj)push进去
queue << work_unit

4.times do
  threads << Thread.new do
    # 循环执行,直到队列为空
    until queue.empty?
      # 当取出为空时抛出异常
      work_unit = queue.pop(true) rescue nil
      if work_unit
        # 执行工作
      end
    end
    # 当任务队列进行完毕,就将结束
  end
end

# 等待所有线程执行完毕
threads.each { |t| t.join }

最终运行,可以发现,已经多线程执行任务了,并且用到了四核心的处理器。</p>