それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

Rubyのスレッド関連の情報まとめ

Rubyのスレッド関連Doc

Rubyのスレッド関連の情報リンクをまとめてみた。公式Docも添付ライブラリ・標準ライブラリ・コアと3種類あったりして探すのが面倒。

コア

スレッド

  • Ruby スレッド
    1. Ruby のスレッドの仕様
    2. スレッドと例外

組み込みクラス

Thread
library _builtin

添付ライブラリ

ライブラリ一覧

  • マルチスレッド・同期
  • thread Mutex, Queue などのスレッド関連ユーティリティ
    • timeout タイムアウトを行うメソッド timeout
    • monitor モニタライブラリ (並行処理プリミティブ)
    • mutex_m Mutexのモジュール版
    • sync Mix-inにより再入可能なreader/writerロック機能を提供するライブラリ
    • thwait thread synchronization class

スレッドの動作について。rubyソースコード解説より

  • 第19章 スレッド
    • いつ
    • どのスレッドに
    • どうやって
  • コンテキストを切り替えるか
  • いつ:トリガー
    • I/O待ち
    • 別スレッド待ち
    • 時間待ち
    • 時間切れによる切り替え
  • どのスレッドに:スケジューリング
    • rb_thread_schedule()
    • select
    • selectの準備
    • selectを呼ぶ
    • タイムアウト/正常終了
    • 次のスレッドを決定
  • スレッドを切り替える

プリエンプティブ・ノンプリエンプティブ

実際の例。
socket ライブラリを使った場合、 Socket.gethostbyaddr か Socket.getaddrinfo を使って逆引きを行います。これらは同名の C の関数を内部的に呼びます。逆引きには数秒間かかることがありますが、Ruby のスレッドはユーザレベルスレッドであるため、C の関数を呼んでいる間は他のスレッドはまったく動きません。このため、マルチスレッドで並列に逆引きしようとしても実際には逐次的に行われてしまいます。

一方、 resolv ライブラリでは gethostbyaddr などに相当する部分が Ruby で書かれているため、Cの関数呼び出しで長時間ブロックされることなしに、並列に逆引きを行えます。