##Threadとは?
メインのプログラムを読み込む作業と並列して実行されるrubyのプログラムのことです。
実行したいプログラムを分担するようなイメージですね。
その並行して実行させているプログラミングのことを並行プログラミングといいます。
##Threadの種類と、それの作り方
Threadには、プログラムが開始されたときに実行されるmainThreadや、現在実行されているcurrentThreadなどがあります。
実際にそのコードを打ってみましょう
p Thread.main
=> #<Thread:0x000001d6ff90c450 run>
p Thread.current
=> #<Thread:0x000001d6ff90c450 run>
自分の実行環境では、スレッドを作ってないため参考にならないかもしれませんが、違う数字が返ってくることもあります。
では、実際にあらたなスレッドを作ってみましょう。
スレッドの作り方はnew, start, forkを使って、その後ろにブロックをつけてあげることで生成することができます。
Thread.new { 'hogehoge' }
=> #<Thread:0x000001d684e78680 (irb):108 run>
Thread.fork{ 'fugafuga' }
=> #<Thread:0x000001d684eb2e98 (irb):114 run>
Thread.start{ 'fugahogefuga' }
=> #<Thread:0x000001d684e09e60 (irb):115 run>
##並行プログラミングを実際に使ってみる
#スレッドを使わない場合
def hoge
sleep(2)
puts Time.now.strftime("%H時%M分%S秒")
p 'hoge'
end
def fuga
sleep(2)
puts Time.now.strftime("%H時%M分%S秒")
p 'fuga'
end
hoge
10時48分18秒
=> "hoge"
fuga
10時48分20秒
=> "fuga"
#スレッドを使った場合
threads = []
threads << Thread.fork { hoge() }
threads << Thread.fork { fuga() }
threads.each { |thr| thr.join }
=>10時56分26秒
"hoge"
10時56分26秒
"fuga"
上のコードを書くことで、複数の処理を同時並行で処理が可能になるんです。
※上のコードでjoinメソッドを使っていますが、公式ドキュメントによると、処理が終わるまで待機していると書いているのですが、上のコードでなぜ処理が終了する時間が同じなのかわかりません。
分かる方いらっしゃったらご教示いただけると幸いです。
【参考資料】