読者です 読者をやめる 読者になる 読者になる

感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

Rubyで基礎的なマルチスレッドプログラミングをするためのサンプル

<スポンサーリンク>

スレッドとは

スレッドとは、プログラムの処理の流れのことである。
複数の処理の流れを持つプログラムを「マルチスレッドのプログラム」と呼ぶ。
これは特段特別な概念ではなく、日常生活でもよくあることである。
本命の彼女と付き合いながら、もう一人別の子と付き合ったりするとき。
この人はマルチスレッドで女性と付き合ってると言えるし、合コンで出会っていいなと思った女の子が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

勉強した本

Rubyアプリケーションプログラミング

Rubyアプリケーションプログラミング


古い本だけど、Rubyについてとても詳しく解説してくれている。
「たのしいRuby」ではたしかマルチスレッドプログラミングには触れてなかったはずで、「たのしい」の次に読む本にこの本を買った。まぁ、「たのしい」もだいぶ忘れているので、立ち返りながらやってるけれど。

感謝のプログラミング

今回で感謝のプログラミングは【563時間目】
10000時間まで、あと【9437時間】