34

Rails 4 で複数のリクエストを同時に処理しようとしていますが、これは Rails 3 で非常に簡単に実行できましconfig.threadsafe!Puma

私がこのコントローラーを持っているとしましょう

class ConcurrentController < ApplicationController
  def index
    sleep 10000
  end

  def show
  end
end

puma -t 2:16 -p 3000以前は、 (最小 2 スレッドの場合) でpuma を開始し、ヒットindexshowてからshow、適切にレンダリングすることができました。

Rails 4 で同じことをしようとすると、Puma はindexリクエストをロックし、showレンダリングされません。サーバーにアクセスすると、Puma から次のエラーがCtrl-C表示されます。

Rack app error: #<ThreadError: Attempt to unlock a mutex which is locked by another thread>

Rails 4 で並行処理を行うには何が足りないのでしょうか? config.threadsafe!必要ないはずです(試しても違いはありません)

4

3 に答える 3

38

config.threadsafe!この記事の構成オプションについて読むことをお勧めしますconfig.threadsafe を削除します! config.threadsafe!のオプション、特に同時実行を許可する オプションをよりよく理解するのに役立ちます。

Railsconfig.threadsafe!ではデフォルトで 4 が設定されています。


では答えへ

Rails 4 では、デフォルトで DEV 環境の Rack::Lock ミドルウェアによってリクエストが Mutex にラップされます。

同時実行を有効にしたい場合は、設定できますconfig.allow_concurrency=true。これにより、Rack::Lock ミドルウェアが無効になります。あなたの質問に対する別の回答で述べられているように、私はそれを削除しません。それは私にはハックのように見えます。

: (Rack::Lock request mutex)config.cache_classes=trueへの割り当てconfig.allow_concurrencyが有効にならない場合は、デフォルトで同時リクエストが許可されます。がある場合は 、 またはのいずれかにconfig.cache_classes=false設定できます 。DEV環境では、このようにしたいでしょうconfig.allow_concurrencytruefalse

config.cache_classes=false
config.allow_concurrency=true

ステートメント:これは、config.cache_classes = false (デフォルトで dev env にある) の場合、同時要求を行うことができないことを意味します。は正しくありません。

付録

MRI と JRuby を使用して同時実行性をテストする実験を設定するこの回答を参照できます。結果は驚くべきものです。MRI は JRuby よりも高速でした。

MRI 同時実行の実験はGitHub にあります。この実験では、同時リクエストのみをテストします。コントローラーに競合状態はありません。ただし、上記の記事の例を実装してコントローラーで競合状態をテストすることはそれほど難しくないと思います。

于 2015-05-14T02:02:58.693 に答える
-1

あなたはユニコーンを試すことができます。これは開発モードでは非常に簡単です:

http://dave.is/unicorn.html

于 2014-05-09T11:34:31.417 に答える