0

Ruby on Railsはシングルスレッドアプリケーションですか?特にmysqlクエリを実行している場合は、同時実行性をサポートしていないように感じます。

私はPhusionPassengerでruby1.8.7とrails2.3.11を使用しています(すべてBluehostから提供されています)。また、これは私の開発サーバーに使用しているものです

[2013-03-19 10:42:00] INFO  WEBrick 1.3.1
[2013-03-19 10:42:00] INFO  ruby 1.8.7 (2012-02-08) [universal-darwin12.0]
[2013-03-19 10:42:00] INFO  WEBrick::HTTPServer#start: pid=23034 port=3000

次のシナリオでは、アプリケーションが使用できなくなります。

ステップ1:一括挿入(大量のデータ)<-トランザクションがデータをコミットしているときにこれがスタックします。

ステップ2:挿入の別のテーブルからクエリを実行し、JSONオブジェクトをフェッチします。

これはコンソールから発生していることがわかります。「プール」を増やしてみましたが(これによりmysqlの同時接続が増えると思いました)、パフォーマンスは向上しませんでした。

4

2 に答える 2

3

デフォルトでは、Rails はシングル スレッドです。これは、主に MRI Ruby のスレッド同時実行サポートが貧弱であるためです。次の方法で、Rails をマルチスレッド モードにすることができます。

config.thread_safe!

Rails 4 ではこれがデフォルトになります。一般に、Rails で長時間実行されるプロセスを開始する必要がある場合は、DelayedJobResque、またはBeanstalkなどを使用して、別のバックグラウンド プロセスで大部分の作業を実行することをお勧めします。他のスレッドが結果を利用できるようになるまでの時間は、完了するまでにかかる時間と、一括挿入全体が 1 つのトランザクションで行われるか、いくつかの小さなトランザクションで行われるかによって異なります。

于 2013-03-19T17:59:57.493 に答える
0

デフォルトでシリアルスレッド化されていると思います(1つのリクエストを最後まで処理し、次に別のリクエストを処理します)。マルチスレッドを有効にするには、あなたがしたようにプールサイズを指定して実行します

config.threadsafe!

environment.rb タイプのファイルに。

これがあなたが説明するシナリオに影響を与えるとは思いませんが、MySqlが他のコミットが終了するのを「待っている」ように聞こえます。

于 2013-03-19T17:54:45.593 に答える