【Ruby3.x】Thread::fetch()メソッドの使い方
fetchメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
fetchメソッドは、Threadオブジェクトが持つスレッドローカル変数の値を取得するメソッドです。
スレッドローカル変数とは、複数のスレッドが同時に動作するマルチスレッド環境において、各スレッドがそれぞれ独立して保持できるデータ領域のことです。これにより、あるスレッドが持つデータが、他のスレッドの同名のデータと混同したり干渉したりすることなく、安全に利用できます。
このメソッドは、引数として指定されたキーに対応する値を、現在のThreadオブジェクトのスレッドローカル変数から取得します。値の取得方法はいくつかあります。
第一に、キーのみを指定するfetch(key)の場合、もし指定されたキーがスレッドローカル変数に存在しないときはKeyErrorが発生します。
第二に、fetch(key, default_value)のように、キーとデフォルト値を指定した場合、キーが存在しないときはdefault_valueが返されます。
第三に、fetch(key) { |k| ... }のように、キーとブロックを指定した場合、キーが存在しないときは指定されたブロックが実行され、そのブロックの戻り値が返されます。このブロックには、存在しなかったキーが引数として渡されます。
fetchメソッドは、各スレッドに固有のコンテキスト情報や設定を安全に管理したい場合に非常に有用です。例えば、ログのトレースIDやデータベースのコネクションなど、スレッドごとに異なる状態を保持する際に利用され、並行処理におけるデータの独立性と信頼性を向上させる重要な機能です。
構文(syntax)
1Thread.current.fetch(:some_key, "default_value")
引数(parameters)
key, default = nil
- key: スレッドローカルストレージから取得したい値のキー
- default = nil: 指定したキーに対応する値が存在しない場合に返されるデフォルト値。指定しない場合はnilが返されます。
戻り値(return)
Object
Thread.fetch メソッドは、スレッドが処理を完了するまで待機し、そのスレッドの実行結果を返します。