sinatra 0.1.5ソース学習

2767 ワード

宣言
本文はsinatraソースシリーズ第3編です.シリーズの目的はsinatraを通じてrubyプログラミングのテクニックを学ぶことです.文章はプログラム運行の前後順に重点分析を選び、前の文章で分析したことは省略しない.レベルは限られており、書かれていることはできるだけ信頼できる公式/討論リンクを提供し、通行人を坑わない.
重要な注意
1.9+のrubyでは、Stringのインスタンスがeachメソッドに応答しないため、1.8バージョンのrubyをインストールする必要があります.これはrackエラーを直接引き起こす可能性があります.rvmを使用して1.8.7バージョンのrubyをインストールできます.rvmを使用する場合は、まず最新バージョンにアップグレードしてください.そうしないと、1.8.7バージョンのrubyをインストールするときもエラーが発生します.
本人がsinatra 0.1.5を実行して使用したrubyとキーgemのバージョンを列挙します.
  • ruby-1.8.7-p374
  • rack 1.4.1
  • mongrel 1.1.5

  • change log
  • 増加Mutex
  • は、要求を処理する前のイベントコールバック
  • をサポートする.
    このバージョンの変更は主にeventに集中している.Erbファイルにあります.
    event.erb
    Mutex反発ロック
    複数のスレッドが共通リソースを読み書きする場合、反発ロックを使用して、各スレッドが読み書き時に原子操作であることを保証します.
    反発ロックを使用するには、まず、共通リソースとアクセスするコードを区別し、反発ロックでコードを分離します.
    sinatra自身のコードは、共通リソースを読み書きすることはできません(共通リソースのみを使用するか、スレッドごとに独自の変数を使用するか)ため、複数のリクエストを同時に処理するためにマルチスレッドで実行できますが、リクエストを処理する際に実行されるユーザー定義のコードには、共通リソースにアクセスできるものがあります.この部分のコード(要求を処理するコード、要求を処理する前と後のイベントコールバック)は、反発ロックを使用する必要がある場合があります.sinatraのデフォルトでは、反発ロックは使用されません.
    sinatraがマルチスレッド環境で実行されるかどうかは、Rack handler(このバージョンのsinatraではMongrelが使用されている)がマルチスレッドをサポートし、マルチスレッドで実行されるかどうかによって異なります.詳しくはこちらを参照
    次にsinatra反発ロックの実装を見る.Eventクラス変数@@mutexでMutexインスタンスを保存した後、@@mutex.synchronize do ... endを呼び出して同じ時間に1つのスレッドしかないコードを実装します.これらのコードはEventクラスメソッドであるか、Eventのインスタンスメソッドであるか、公共リソースにアクセスできます.反発ロックが使用されると、sinatraは同じ時間に1つのリクエストにしか応答できません.run_safelyは、ユーザがプログラムを実行するときにuse_mutextrueに設定されているかどうかを確認します.はい、synchronizeでコードを実行します.そうでなければ、直接コードを実行します.use_mutexのデフォルトはfalseです.
    他にもいくつかの参考記事があります.
  • Ruby - Multithreading
  • Thread Safety With Ruby
  • Signals, Traps and Rescues

  • before_filters
    ユーザーはbefore_を使用できます.filtersは、ライセンス、検証、パラメータフィルタリングなどを行います.
    sinatra before_filtersとafter_filtersは1つに結合され、それぞれsetup_filtercall_filtersと書かれている.
    cattr_を先に使用したおかげでaccessorは対応するsetter/getterを設定し、setup_filtersend(filter_set_name)によってfilters配列を動的に取得することができる.
    before_filtersには:halt異常を投げ出す方法がなく,要求は通常の流れで実行される.:halt異常が投げ出された場合、要求を処理する方法はスキップされますが、after_filtersはまだ実行されます.:halt異常を放出した場合はパラメータを付けてもよく、StringまたはSymbolタイプであればhelperメソッドとして呼び出され、Fixnumタイプであればステータスコードとして扱われる.
    ここではObject#caseメソッドを用い,caseは1つの値がある条件を満たすか否かを判断し,この条件の===メソッドを用い,この値をパラメータとして伝達し,例を挙げる.
    x = 10
    
    case x
    when 10
      p 'x is 10'
    end
    
    #                
    
    if 10 === x
      p 'x is 10'
    end
    
    #    Fixnum        ===   ,            
    
    case x
    when Fixnum
      p 'x is 10'
    end
    

    全文が終わる.