ちょっと背伸びしてマルチスレッド。

注文をタッチパネル式端末から出来る居酒屋に行ってきた。これは便利だ。
こういう端末を見ると仕事柄、ついついUIが気になり「ここはこうしたほうが良さそうだ」「なるほど、そういう理由でこうしているのか」なんて思うけど、席を共にしている人はそういう人じゃないので、口に出さないように注意するのが大変だった。
やはりこのAAを思い出した。
というわけで、Threadを使ってマルチスレッドで処理を書いてみる。

#!/usr/bin/env ruby

require 'open-uri'

uri_list = ['http://www.yahoo.co.jp', 'http://www.google.co.jp']
threads = []

count = 0
uri_list.each do |uri|
  # uriをコンストラクタに渡しているのは、
  # Threadを作成した際の値をThread内部の処理で使用するため。
  # また、何個でも指定可能で、指定した順にブロックの引数として
  # 内部に渡される。
  threads << Thread.new(uri) do |uri_in_thread|
    puts "#{uri_in_thread}取得開始"
    open(uri_in_thread) do |file|
      puts "base_uri:#{file.base_uri}, size:#{file.size}"
    end
    puts "#{uri_in_thread}取得終了"
  end
end

threads.each { |thread| thread.join}

結果。

http://www.yahoo.co.jp取得開始
http://www.google.co.jp取得開始
base_uri:http://www.yahoo.co.jp, size:68602
http://www.yahoo.co.jp取得終了
base_uri:http://www.google.co.jp, size:2671
http://www.google.co.jp取得終了

簡単だ。けど、もういちいち驚かない。


プログラミングRuby 第2版 言語編

プログラミングRuby 第2版 言語編