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
以上です。