3

Railsアプリケーションでリクエストスコープごとに情報を共有するために、rubyでThread.Currentハッシュを使用することを計画しています。(これは最良の設計上の決定ではなく、MVCを壊している可能性があることを私は知っています)。私はここで言及されているアプローチを見ていますhttp://coderrr.wordpress.com/2008/04/10/lets-stop-polluting-the-threadcurrent-hash/

これは基本的にthread_local_accessorメソッドをクラスに追加し、指定されたスレッドがスコープ外になったときにスイープを提供します。これに他の制限や私が知っておくべき落とし穴があるかどうか誰かが知っていますか?または、よりクリーンなレベルハッシュを要求する他の方法はありますか?

4

1 に答える 1

0

リンク先のコードはスレッドセーフではありません。スレッドセーフではない Ruby の Hash クラスを使用します。Mutex などの ruby​​ の同期プリミティブの 1 つを使用してアクセスを保護できます。

また、スレッド ID でインデックス付けされたグローバル データ構造を使用することが、単に Thread.current を使用するよりも優れているとは確信していません。

キーの競合が心配な場合は、GUID などの一意のキーを選択してください。あなたが提供したリンクの例に基づいて構築します:

class ThreadedLibrary
  @@LIBRARY_ID = 'D0052660-60E6-4624-B08E-ECA9200B2949'
  Thread.current[@@LIBRARY_ID] = {}

  def self.some_setting= val
    Thread.current[@@LIBRARY_ID][:some_setting] = val
  end

  def self.some_setting
    Thread.current[@@LIBRARY_ID][:some_setting] ||= :default
  end
end
于 2013-11-13T00:57:15.727 に答える