問題タブ [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 - jruby スレッド化セットアップでの redis の使用
したがって、redis gem はスレッドセーフであるはずです。それは良いことです。しかし、どのように設定する必要があるのか 疑問に思っています。jRuby と Celluloid を使用しています (デフォルトのファイバーを使用)。
私が今それを使用している方法は、グローバルメソッドが定義されていることです:
Redis クライアントのタイムアウト パラメータを 30 に設定しています。スレッド セーフの問題は発生していないと思います (スレッドを生成する前に初期化します) が、Redis::TimeoutErrorエラーが発生することがあります。これらのスレッドが接続を永遠に開いたままにして、最終的に利用可能なすべての接続を占有するのではないかと思いますか?
基本的に問題は、時々 Redis::TimeoutError が発生することです。ある時点で開いている接続を確認する方法はありますか? または、問題が何であるか考えていますか?
ありがとう
ruby - 何千もの非同期リクエストを処理するRubyの最良の方法は?
タスクは、クォート ティックをほぼリアルタイムで処理することです (1 秒の遅延)。
現時点では、約 100 の見積もりを処理する必要がありますが、数千に増える可能性があります。私はEM
現在、それぞれが 10 個の非同期リクエストを実行し、後で処理するためにデータを PubSub に入れる 10 個のスレッドを実行することを検討しています。
また、 gemでテストCelluloid-IO
しています。HTTP
私は正しい道を進んでいますか?実装しようとして失敗したことを GitHub で確認しようとしました。
ruby - アクターを使用するプログラムを設計および構築する方法
Joe Armstrong の論文から、彼はアクター ベースのプログラムは次の 3 つの手順で設計する必要があると指定しました。問題は、ステップが実際の問題にどのように対応するか、またはそれらをどのように適用するかを理解していないことです。これがジョーの最初の提案です。
- 私たちは、現実世界の活動において、すべての真に同時の活動を識別します。
- 並行アクティビティ間のすべてのメッセージ チャネルを識別します。
- さまざまなメッセージ チャネルを流れるすべてのメッセージを書き留めます。それではプログラムを書いていきます。プログラムの構造は、問題の構造に正確に従っている必要があります。現実世界の各並行アクティビティは、プログラミング言語で正確に 1 つの並行プロセスにマップする必要があります。問題がプログラムに 1 対 1 でマッピングされている場合、そのプログラムは問題と同型であると言えます。
マッピングが正確に 1:1 であることが非常に重要です。その理由は、問題と解決策の間の概念的なギャップを最小限に抑えるためです。このマッピングが 1:1 でない場合、プログラムはすぐに劣化し、理解しにくくなります。この縮退は、CO 以外の言語を使用して並行問題を解決する場合によく見られます。多くの場合、プログラムを機能させる唯一の方法は、いくつかの独立したアクティビティを同じ言語スレッドまたはプロセスで制御することです。これにより、不可避的に明瞭さが失われ、プログラムが複雑で再現不可能な干渉エラーにさらされることになります。
1番は割とわかりやすいと思います。私が迷子になるのは#2(および3)です。私の欲求不満を説明するために、この要旨で利用可能な小さなサービスをスタブ化しました (コールバックを備えた Ruby サービス)。
そのサンプル サービスを見ると、#1 の答えがわかります。5つの同時サービスがあります。
- 始める
- ログインゲートウェイ
- ログアウトゲートウェイ
- 止まる
- 申し込む
これらのサービスの一部は、サービスの状態によっては機能しません (または機能しないはずです)。サービスが開始されていない場合、ログイン/ログアウト/購読は意味がありません。この種の状態情報は、Joe の 3 つのステップに関連していますか?
とにかく、その要旨のサンプル/モック サービスを考えると、誰かがこのサービスを Actory の方法でラップするプログラムをどのように設計するのか疑問に思っています。Joe の 3 つのステップを適用する方法に関するガイドラインのリストを確認したいと思います。いくつかのコード (任意の言語) を書くためのボーナス ポイント。
ruby-on-rails - グローバルセルロイドプールの設定
Rails アプリケーションで Celluloid プールを使用して、ユーザーがファイルをアップロードした後に PDF 変換をオフロードしています。
初期化子を使用して、アプリケーションのグローバル変換プールを作成しました。
私の開発環境(OS X、シン)ではすべてうまくいきました。また、私の CentOS ボックス (Apache、Passenger) でも問題なく実行できます。
これは基本的に初期設定です。
config/initializers/converter_pool.rb
lib/X/convert.rb
lib/X/convert_async.rb
ある段階で、私のプールは CentOS ボックス (usertest env) で動作を停止しましたが、私の開発環境では問題なく動作し続けました。
追記: 画像を更新するメソッドがコンソールから呼び出された場合でも、プールは機能していました。問題は、ロード順序または何らかのアクセス許可に関係していたと思います。
何が原因なのかわからない - 新しい Linux カーネルと gem の更新があった。
さまざまな試みの後、クラス定義の後にプールを初期化し、プールの初期化子を削除することで、最終的に再び機能するようになりました。
何が起こったのかをよりよく理解したいので、まだ質問があります。
何が原因だったのか誰か知っていますか?クラス定義の後にセルロイドプールをインスタンス化するのは悪い考えですか? 潜在的な問題はありますか?
光を当てることができる人には、事前に感謝します:)乾杯、オイゲン
ruby-on-rails - Celluloid/Sidekiq & Rails 3.2 と MRI Ruby を使用し、以前はスレッドセーフ用に設計されていなかったアプリは実行可能ですか?
Passenger の MRI Ruby と Rails 3.2 で、スレッド セーフを考慮して設計されていないアプリを実行している大きなプロジェクトがあり、このアプリは DelayedJob を介してメーリングを処理し、データベースはこれに多額の費用を支払っています。
sidekiq railscast http://railscasts.com/episodes/366-sidekiqには、考えられるいくつかの問題が記載されています。
- データベース接続制限 (スレッドプール 1 を使用する場合、データベース接続制限は 2 倍にする必要があります)
- スレッドセーフ (これはおそらくショーストッパーです)
- 繊維安全?これはARの問題ですか?
したがって、質問は次のとおりです。
- メール生成がパッセンジャー プロセス内のスレッドで動作するように、大きなプロジェクトをスレッド セーフにすることは、どの程度実行可能でしょうか? (郵送は AR に依存するほど複雑です)
- sidekiq を使用する場合の同じ質問、「sidekiq を使用してメール生成が機能するように、大きなプロジェクトをスレッドセーフにすることはどの程度実行可能ですか? (メールは AR に依存するほど複雑です)」
- データベース接続の制限とスレッドセーフの問題以外に、他に考慮すべきこと、または私が予見できなかったあまり明白でない問題はありますか?
ruby - Zlib::GzipReader のノンブロッキング形式はありますか?
パイプからデータを読み取ることを使用してストリーミング Gzip デコンプレッサを実装しようとしてZlib::GzipReader
いますが、ブロックしない方法でそれを行う方法がわかりません。関連するコードは次のとおりです。
圧縮された文字列全体をリーダーに読み込まずに、解凍されたコンテンツをストリーミングするにはどうすればよいですか?