24

免責事項:私は「RoR」を学習しているac#ASP.NET開発者です。この質問でRoRが「取得」されない場合は申し訳ありませんが、修正をいただければ幸いです。

マルチスレッドとは

Webアプリの「マルチスレッド」機能についての私の理解は2つあります。

  1. Web /アプリサーバーはリクエストを受信するたびに、新しいリクエストにスレッドを割り当てることができるため、複数のリクエストを同時に実行できます。
  2. アプリのランタイム+言語を使用すると、単一の要求内で複数のスレッドを使用できます(ASP.NETでは「非同期」メソッドやキーワードを使用するなど)。

このようにして、IIS7+ASP.NETはポイント1と2を実行できます。

RoRについて混乱しています

私はこれらの2つの記事を読みましたが、混乱してしまいました。

質問1。

RoRは、上記のポイント2にあまり適していないこと、つまり、同じリクエスト内に複数のスレッドがあることを理解していると思いますが、私はそれを正しく理解していますか?

質問2。

明確にするために、RoRアプリ/ウェブサーバーは右上のポイント番号1を実行することもできます(つまり、複数のリクエストを同時に実行できます)?RoRの場合は必ずしもそうとは限りませんか?

4

3 に答える 3

37

質問1: 必要に応じて、1つのリクエストでより多くのRubyスレッドを生成できますが、これはRailsの一般的なユースケースの範囲外のようです。特定の長時間実行されるIOまたは外部操作に使用されます。

質問2: Railsだけでなく、一般的なRubyの同時実行性の制限要因はGlobal Interpreter Lockです。Rubyのこの機能は、プロセスごとに常に複数のRubyスレッドが実行されるのを防ぎます。ディスクIOまたはSQL応答の待機など、Ruby以外のコードが実行されると、ロックが解除されます。これを回避するには、JRubyなどのデフォルトとは異なるRubyの実装を使用しますが、すべてではありません。

Phusion Passengerは、プロセスベースの同時実行性を使用していくつかの要求を同時に処理するため、厳密に言えば、「マルチスレッド」ではありませんが、それでも同時実行です。

Ruby MidWest 2011からのこの講演では、マルチスレッドのRubyonRailsを導入することについていくつかの良い考えがあります。

于 2012-10-08T02:53:23.077 に答える
3

これは「ASP.NETからRoRへ」に関するものなので、覚えておくべきもう1つの重要な詳細があります。* nix環境では、マルチスレッドではなくマルチプロセッシングによってサービスアプリケーションの同時実行を実現するのが一般的です。これははるか昔に遡るアーキテクチャであり、フォークコピーオンライトを使用する*nixシステムでのマルチプロセッシングの比較的安価なコストに関連しています。各プロセスは単一のスレッドで一度に1つのリクエストを処理し、メインプロセスはワーカーの子プロセスの生成と強制終了を制御します。複数のリクエストは、異なる子プロセスによって同時に処理されます。

Apacheなどの最新のサービスアプリケーションには、マルチプロセス、マルチスレッド、さらには複合モードがあります(サービスが複数のプロセスをフォークし、それぞれが複数のスレッドを実行します)。

アプリケーションが移植性を念頭に置いて構築された場合(例:Apache、MySQLなど)、* nixシステムではマルチプロセスモードまたは複合モードで、Windowsサーバーではマルチスレッドモードで実行するのが通例です。

ただし、確かに、RailsはWindowsの前面にいくらか欠けています。Windowsで実行できないわけではありません。Windowsサーバーで本番環境で使用するために適切かつスムーズに実行できるようにするために多くの労力が費やされていないだけです。これは、RoRコミュニティの間で一般的な本番プラットフォームではありません。

その結果、Eventhough Rails自体はバージョン2.2以降スレッドセーフですが、Windowsサーバーにはまだ適切なマルチスレッドサーバーがありません。また、マルチプロセス/シングルスレッドの同時実行モデルを使用して* nixサーバーで実行すると、最良の結果が得られます。

于 2014-03-21T12:10:05.010 に答える
2

フレームワークとしてのRailsはスレッドセーフです。だから、答えはイエスです!

ここに投稿した2番目のリンクは、マルチスレッドでうまく機能しない多くのRailsサーバーの名前です。彼は後でnginxが進むべき道であると述べています(これは間違いなく最も人気があり、強くお勧めします)。しかし、彼は彼が結論に至った理由については言及していません。Ruby 1.9.3は最近リリースされ、以前には存在しなかった新しいスレッド機能が組み込まれています。

マルチスレッドの使用は、通常、ユースケースによって異なります。個人的には1年前に試しましたが、機能しましたが、マルチスレッドを使用する方が長時間実行されるタスクをプッシュするよりも理にかなっているユースケースに出くわしたことがないため、本番コードでは使用していません。バックグラウンドジョブ。

これをもっと探求したいと思います。したがって、達成しようとしていることを説明できれば、POCを実行できる可能性があります。

于 2012-10-07T15:52:24.013 に答える