4

レールのスレッドローカル変数よりもファイバーローカル変数をいつ使用するかについて、私は非常に混乱しています。私の使用例は次のとおりです。
レールにコントローラーがあり、GET 要求で計算を行い、結果 (整数のリスト) をファイバーまたはスレッドのローカル変数に格納します。これを行う必要があるのは、この計算結果を、コントローラーによって作成される可能性のあるモデルで超過できるようにするためです。この計算はGETリクエストごとに実行する必要があるため、セッションに保存したくありません。また、コントローラーの GET メソッドが完了する直前に、ファイバー/スレッド ローカル変数をクリアします。

ここで、Fiber と Thread の両方がまったく異なるため、ストレージ変数が異なることがわかります。誰がどの種類の変数をいつ使用するか説明できますか?

実際、私の理解は次のとおりです.2つのリクエストが同じファイバー/スレッドで同時に処理されることはないようです。したがって、リクエストスコープに入れたい値がある場合は、どちらでもかまいません。私の説明は正しいですか?

4

1 に答える 1

3

答えは、Web サーバーが複数のユーザーに同時にサービスを提供するためにスレッドとファイバーのどちらを使用するかによって異なります。

驚くほど多くの Ruby Web サーバーがどちらも使用していません。一度に 1 つのクライアントのみにサービスを提供するか (Webrick や Thin のように)、プロセスを使用して複数のユーザーにサービスを提供します (nginx のパッセンジャーのように)。

ただし、このブログ投稿に示されているように、小さな実装のおかげで、これらの各ケース (マルチスレッド、マルチファイバー、またはマルチプロセス) で機能する答えがあるようです。

Ruby スレッド ローカルもファイバー ローカルです

ファイバーには独自のスタックがあるため、スレッドローカル変数もファイバーローカルにならないのではないかと少し心配していました。これは、スレッド ローカル変数を使用してスタック コンテキストを区切るコード (たとえば、動的スコープの変数を実装するため、または再帰を防ぐため) で問題になります。しかし、私の恐れは簡単に和らぎました。

繰り返しますが、Ruby は小さなことを正しく処理します。

結論 - スレッドローカルを使用 - 動作するはずです。

于 2014-05-27T15:19:05.790 に答える