問題タブ [celluloid]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ruby-on-rails - RubyでGILを無効にする方法は?
私は Ruby の初心者で、セルロイド ライブラリを使用して実装されたマルチスレッドの Ruby プログラムを実行するプロジェクトに取り組んでいました。
コマンドを使用してプログラムを実行しようとすると、次のようになります。
コードが正しく実行されず、GIL が複数のコアの使用を停止していると表示されます。GIL は ruby インタープリターが使用するロック機構であることは理解していますが、並行プログラムを実行するための特別なコマンドでそれを無効にする方法があるかどうか疑問に思っていました。
これが不可能な場合、Ruby でマルチスレッド プログラムを実行する他の方法はありますか? Ruby でそのようなマルチスレッドをサポートするオンライン エディタ/IDE を使用しますか?
ruby - celluloid アクター - フューチャーの使用中に Celluloid.shutdown_timeout ですべてのアクターを終了する方法
今のところ動作しているようで、アクターは 1 秒後にシャットダウンされます。
しかし、上記のように値にアクセスしようとすると、メソッド呼び出しから返された値が利用可能になるまで続きます。
私の考えは、標準 の Timeout.timeout(1) {}と同じように Celluloid.shutdown_timeout を使用することでした
制限時間の 1 秒を超えた場合はブロックを終了します [ Timeout.timeout(1)は不正行為で悪名高いため、使用しないでください]
セルロイド俳優を使用してこれを達成する正しい方法は何ですか?
multithreading - より多くのリクエスト/秒の処理の遅延
セルロイドを使用した JRuby アプリケーションがあります。Zeromq ソケットを介してリクエストを受信し、JSON 文字列で応答します。
したがって、私のアプリケーションには 2 つのアクターがあり、1 つはリクエストを処理するため、もう 1 つは応答を送信するためです (Zeromq のプッシュ ソケット)。アプリケーションは約 30 リクエスト/秒のレートでリクエストを受け取ります。将来的には 1000 リクエスト/秒になるでしょう。ただし、1 秒あたりのリクエスト数が増えると、処理に時間がかかります。より多くの CPU を使用し始めます。
受信したリクエストごとに、遅延ブロック内で処理しています。
1 秒あたり 20 リクエストの場合、遅延なく正常に動作します。サーバーは 15Gb RAM と 4 コアの構成です。Postgres DB と Redis DB にも接続します。しかし、それはここでは問題ではないようです。
これが私が持っている基本的な構造です。主な俳優サービスがあります。
これにより、10 個のプールを持つ PushSock アクターのインスタンスが内部的に作成されます。
上記の defer ブロックの send_response メソッドは、pushsocket アクターを呼び出します。defer ブロックでは、ResponseHandler は Actor ではありません。
そのため、Service Actor ではプールを使用していません。
ruby-on-rails - ルビーセルロイド「環境」
私はセルロイドに非常に慣れていませんが、Rails アプリで先物が現在のロケールを失う理由がわかりません。
基本的に私は次のようなものを得ました
ロケールを変更すると、先物はデフォルトのロケールを考慮し続けます:it
基本的なものが欠けているような気がします...
sockets - Celluloid::TaskTerminated: タスクが終了しました
celluloid-zmq を使用しており、アプリケーションで複数のソケットに接続しています。アプリケーションはバックグラウンドでループをリッスンし続けますが、特定のソケットを閉じると、「セルロイド::タスク終了: タスクが終了しました」というエラーが表示されます
例外でループを終了していますが、
ruby - Ruby - EventMachine/Celluloid を使用した複数の非同期ノンブロッキング HTTP IO の同時実行
14 の HTTP クライアント要求からの応答を集約するサービスにpumaサーバーを使用しています。リクエスト間に依存関係がありますが、あるレベルで並列化できます。ruby/cpu 時間はわずか 50 ミリ秒 (97.3% IO) ですが、各リクエストには 1.8 秒かかります。
現在、私はそれぞれ 25 スレッドの 2 つのプロセスで自動スケーリングされた heroku dyno を使用しています。Elyasinの主張に同意するので、MRI/CRubyを使用して、jRubyがスケーラビリティを大幅に向上させると仮定します。
Puma は、他の要求が IO でブロックされている間、同時要求をうまく処理しています。しかし、ノンブロッキング方式で HTTP クライアント リクエストを並行処理する必要があり、計画しています。
私のシナリオでジュビリーを使用してvert.xをベンチマークする前に。EventMachine::MultiRequestやCelluloidなどの標準的な ruby オプション、またはその他の推奨オプションをベンチマークしたいと考えています。event-machine を使用した puma よりも jubilee/vert.x の方がどれだけパフォーマンスが優れているかを実際に知るために。Ruby ベンチマークとジュビリーを参照してください。
そして私の質問は次のとおりです。
- Puma に最適な代替手段はどれですか?
- 最適な Puma のイベント ループが機能し、 EM::HttpRequest (たとえば) が応答を「ブロックせずに待機」しているときに Puma が同時要求を処理できるようにする方法で設計されている代替手段はどれですか?
- それを達成するために使用する必要がある EventMachine/Celluloid の特定の構成または使用法はありますか?
- 全体として、このシナリオに関するご意見をお待ちしております。