質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
CoffeeScript

CoffeeScriptはプログラミング言語です。シンタックスシュガーの導入により、JavaScriptのコードに変換された後動作します。JavaScriptに比べ、可読性と簡潔性が向上しています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Sinatra

Sinatraは、Rubyで作られた オープンソースのWebアプリケーションフレームワークです。

Q&A

解決済

1回答

1509閲覧

Sinatraで二つのCoffeeScriptに同時アクセスすると固まる

raccy

総合スコア21733

CoffeeScript

CoffeeScriptはプログラミング言語です。シンタックスシュガーの導入により、JavaScriptのコードに変換された後動作します。JavaScriptに比べ、可読性と簡潔性が向上しています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Sinatra

Sinatraは、Rubyで作られた オープンソースのWebアプリケーションフレームワークです。

1グッド

0クリップ

投稿2016/07/02 13:26

###前提・実現したいこと
Sinatraを用いたWebアプリにおいて、CoffeeScriptテンプレートを使用しています。

二つのCoffeeScriptに対して同時にアクセスした場合(HTML側で二つとも呼び出している形)、Webエンジン(Puma)ごとハングアップします。

###発生している問題・エラーメッセージ
エラーメッセージもなく完全に固まります。Ctrl+Cで終了もできなくなります。通常のkillでは終了せず、kill -KILLで強制終了する必要があります。

###該当のソースコード
下記のようにSinatra標準のCoffeeScriptテンプレートを呼び出しています。特にオプション等は指定していません。JSエンジンにはthrubyracerを使用しています。

【app.rbからCoffeeScriptのマッピング部分のみ抜粋】

Ruby

1get '/first.js' do 2 coffee :first 3end 4 5get '/second.js' do 6 coffee :second 7end

現象の再現が可能な検証用のコード全てについては、下記Gistにアップしています。ご確認下さい。
https://gist.github.com/raccy/32706eab92cc07a077f2373d7626f80f

###試したこと
アクセスが一つのみであれば、現象は発生しません。また、therubyracerではなく外部のNode.jsであれば発生しないようです。PumaではなくWEBrickでも発生することを確認しています。タイミングの問題なのか、起きるときと起きないときがあり、その他の条件はよくわかっていません。

###補足情報(言語/FW/ツール等のバージョンなど)
OS X 10.11.5
Ruby 2.3.1
各gemは2016年7月2日時点の最新を使用

同様の現象をCentOS 6.8 (x86_64)でも確認しています。

maisumakun👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

試していないのですが、
Therubyracer isn't thread-safe in production? · Issue #270 · cowboyd/therubyracer
でしょうか。
未解決みたいです。

Like Ruby, V8 also has a global interpreter lock, and so only one thread can be executing code inside the V8 VM at a time. The answer is, I think, to release the GIL where possible when entering the V8 VM, and then reacquire it if and when V8 calls back into Ruby. This may be incompatible with the current strategy of acquiring the V8 lock from within Ruby code.

この辺りを見ると、諦めているようにも見えます。。。


今ひとつ流れを掴めてないですが、
WIP: V8 upgrade by stormbreakerbg · Pull Request #334 · cowboyd/therubyracer
に、

This is fantastic! I would love to see this make it across the goal line, and will help you in whatever way I can!

If you are going to take on this effort, there are a couple of things to consider. First, I think we should remove all locking of V8 from Ruby entirely.

とあり、

Upgrade to v8 4.5, move towards 1.0 release by cowboyd · Pull Request #348 · cowboyd/therubyracer

に続いているようなので、therubytracerが1.0になれば解決するかも知れません。

細かく内容を追ってないので間違っていたらすみません。

投稿2016/07/02 21:51

編集2016/07/02 22:10
eripong

総合スコア1546

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

raccy

2016/07/02 22:47

まさしくこれのようです。issueにあったとりあえずの解決策だというmutexを使ってみたら、パフォーマンスもほとんど変わらずに現象は起きなくなりました。 最終的にはsprocketsで一つのJSにまとめているのですが、開発中の段階で二つにわけて読み込んでいるときに発生した問題でした。therubyracerを使うときはmutexをつけるようにしたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問