0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Ruby Threadについて

Posted at

##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メソッドを使っていますが、公式ドキュメントによると、処理が終わるまで待機していると書いているのですが、上のコードでなぜ処理が終了する時間が同じなのかわかりません。
分かる方いらっしゃったらご教示いただけると幸いです。
【参考資料】

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?