rubyのthreadについて

スレッドは同じプロセス上でメモリを共有しつつ、処理を並列に実行することができます。

スレッドを用いることで、単独で時間がかかる処理を早くすることができる可能性があります。

スレッドの生成

スレッドを作成し、処理を実行するには、Thread.fork/Thread.new/Thread.startを使用します。

下記は複数ファイルの行数を出力する例です。

files = %w(ruby.rb test.rb)
threads = files.map do |file|
  Thread.fork do
    num = File.readlines(file).length
    "#{file}: #{num}"
  end
end
p threads.map(&:value)

変数の扱い

スレッドは同じプロセス上のスレッドとメモリを共有します。

for item in %w(foo bar baz)
  Thread.fork do
    sleep 1
    puts item
  end
end

(Thread.list - [Thread.current]).each &:join

=>baz
=>baz
=>baz

メモリが共有されているので、最後に当たったものを参照しています。

他のスレッドと共有したくない値は、ブロックの仮引数として受け取るようにしましょう。

for item in %w(foo bar baz)
  Thread.fork item do |value|
    sleep 1
    puts value
  end
end

(Thread.list - [Thread.current]).each &:join
=>foo
=>baz
=>bar

以上です。