[Ruby] Threadを使ってみた

パーフェクトRubyを読んでいて、Threadが出てきたので備忘録です。

スレッドとは

1つのプロセス上で複数の処理を実行させる際の処理単位のことです。

Ruby1.8まではOSに依存しないユーザレベルのスレッド(グリーンスレッド)を使っていましたが、スレッド切り替えが頻繁に起こる際のパフォーマンス向上を目的に、1.9以降はネイティブ スレッド(= OS組み込み)を利用する実装に変更されています。

ただし、現在のRubyでは、ネイティブスレッドは常に1つしか利用できないような仕様になっているそうです。公式リファレンスから以下を引用します。

ネイティブ スレッドを用いて実装されていますが、 現在の実装では Ruby VM は Giant VM lock (GVL) を有しており、同時に実行される ネイティブ スレッドは常にひとつです。 ただし、IO 関連のブロックする可能性があるシステムコールを行う場合には GVL を解放します。その場合にはスレッドは同時に実行され得ます。 また拡張ライブラリから GVL を操作できるので、複数のスレッドを 同時に実行するような拡張ライブラリは作成可能です。

スレッド – Ruby2.1.0リファレンスマニュアル

つまり、スレッドは複数立てることができるが、実行中のスレッドは常に1つとなっているようです。

コード

Thread.newで、新しくスレッドを作成します。

スレッドで行う処理内容は、{}の中に書きます。今回の場合は、「スレッドを立てています」という文字を表示する処理を書いています。

処理順番は以下のようになっている。sleep(2)の間に、メインスレッドと子スレッドを行き来しています。

子スレッド作成(メインスレッド)  -> puts "メインスレッドです"(メインスレッド) -> puts "スレッドを立てています"(子スレッド) ->  puts "メインスレッドです"(メインスレッド) ………….

まとめ

Threadは、主にQueueと一緒に使われるのかな。他の記事を読んでそう思いました。

次の記事では、QueueとThreadを一緒に使ってみたいと思います。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA