スレッドとは
スレッドとは、プログラムの処理の流れのことである。
複数の処理の流れを持つプログラムを「マルチスレッドのプログラム」と呼ぶ。
これは特段特別な概念ではなく、日常生活でもよくあることである。
本命の彼女と付き合いながら、もう一人別の子と付き合ったりするとき。
この人はマルチスレッドで女性と付き合ってると言えるし、合コンで出会っていいなと思った女の子が2人いて、同時にメールを送信してデートに誘ったりするのもある意味マルチスレッドである。
もっとちゃんとした例だと、パスタを茹でながらソースを温めるとか、そんな感じだ。
RubyのマルチスレッドはOSのマルチスレッドの機能を利用せずに実装されているため、マルチスレッドを用いてもフクスのプロセッサを利用できない。その代わり、低機能のOS上でもマルチスレッド機能を利用することができるようになっている。
並行して複数の処理を実行させるプログラミングのことを「並行(concurrent)プログラミング」と呼ぶ。
複数のプロセッサを同時に利用する場合を「並列(parallel)プログラミング」と呼ぶ。
Rubyは並行プログラミングをサポートするが、並列プログラミングはサポートしない、と言える。
※いま読んでる本は2002年に出たもので、今のRubyは・・・どうなんだろう。
パーフェクトRubyが届けば、今のRubyがわかるはず!
Rubyでマルチスレッドを作るサンプル
何はともあれ、サンプルを作成してみる。
t1 = Thread.start { loop do puts "B美ちゃんにメールする" sleep(3) end } loop do puts "A子さんにメールする" sleep(2) end
これを実行すると、結果はこうなる。
B美ちゃんにメールするA子さんにメールする A子さんにメールする B美ちゃんにメールする A子さんにメールする B美ちゃんにメールする A子さんにメールする A子さんにメールする ・・・
Threadのstartメソッド。
これはThreadオブジェクトを生成して、ブロック({}のこと)を実行する。
startは「{}」をイテレータで受け取って、それを実行する。
sleepしている間に、スレッドの切り替えが発生する。
なお、Rubyでは、実行していないスレッドが存在しても、メインスレッドの実行が終了した時点でインタプリタ自体が終了してしまう。
スレッドを待ち合わせるのが「join」である。
t1 = Thread.start { 6.times do puts "スレッド1を実行しています" sleep(0.5) end } 3.times do puts "メインスレッドを実行します" end puts "スレッド1の終了を待っています" t1.join puts "スレッド1が終わったので、メインスレッドを終了します"
結果はこうなる。
スレッド1を実行していますメインスレッドを実行します メインスレッドを実行します メインスレッドを実行します スレッド1の終了を待っています スレッド1を実行しています スレッド1を実行しています スレッド1を実行しています スレッド1を実行しています スレッド1を実行しています スレッド1が終わったので、メインスレッドを終了します
このように、joinを使うと、他のスレッドが終了するまでメインを待ち合わせることができる。
Rubyでメソッドを一定時間区切りで定期実行するメソッドサンプル
サンプル1
def every_n_seconds(n) loop do before = Time.now yield interval = n - (Time.now - before) if interval > 0 then sleep(interval) end end end every_n_seconds(1) do puts "test" end
結果
test test test
サンプル2
def every_n_seconds(n) loop do before = Time.now yield sleep(n) end end every_n_seconds(1) do puts "test2" end
勉強した本
- 作者: 前田修吾,まつもとゆきひろ,やまだあきら,永井秀利
- 出版社/メーカー: オーム社
- 発売日: 2002/04
- メディア: 単行本
- 購入: 3人 クリック: 45回
- この商品を含むブログ (26件) を見る
古い本だけど、Rubyについてとても詳しく解説してくれている。
「たのしいRuby」ではたしかマルチスレッドプログラミングには触れてなかったはずで、「たのしい」の次に読む本にこの本を買った。まぁ、「たのしい」もだいぶ忘れているので、立ち返りながらやってるけれど。
感謝のプログラミング
今回で感謝のプログラミングは【563時間目】
10000時間まで、あと【9437時間】