問題タブ [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 - ライブ スレッドは残っていません。デッドロック?
MessageConsumer
HTTP 呼び出し、CRUD Mongo/Redis、API 呼び出しなど、それぞれ異なる責任を持つ一連の worker があります。
それらは同じ構造を持っています:
そして、私は[worker-name].rb
そのようなもので各ワーカーのファイルを持っています:
は@queue.receive_message
Amazon SQS からメッセージを受信し、メッセージを渡してワーカーを呼び出します。
各サーバーには、[worker-name].rb
実行中のセットがあります。
問題:"No live threads left. Deadlock?"
プロセスをしばらく実行した後 (スレッドがビジー状態になった後) 頻繁に発生します。
サーバーで使用ruby 2.0.0p451 (2014-02-24 revision 45167) [x86_64-linux]
していますが、MRI に関連する問題かどうかはわかりません。JRuby に切り替える必要があるかもしれません。しかし興味深いことに、この問題はあまり一般的ではないので、私の実装に問題があるのではないかと思います。
何か案は?
ruby - セルロイドプールで停止したジョブ
アカウントのデータを並行して取得する必要があります。そのためにセルロイドを使用しています。
私のコード
開始時に、すべてのメンバー (ボブ、アリスなど) に対して常に並列要求を行います。しかし、しばらくすると、1 人のユーザー (例: alice) に対してのみ要求が行われます。
do_request
自作の redis キューとCelluloid::Actor.registed
すべてのアカウントにPSが存在する
ruby - セルロイドプールには、初めて呼び出された死んだ俳優がいます
アプリを起動するたびに、最初に呼び出すと、Dead Actors が返されます。その後、期待どおりに戻ります。
次に、コントローラーから呼び出しますBatchProcess.new.fetch(array_of_sites_to_parse)
私はイニシャライザに を入れようとしました@pool = BatchProcess.pool
が、エラーにはなりませんでしたが、アクターはリクエストごとに指数関数的に増加しました。
ruby - セルロイドとの厄介な競合状態
ユーザーが指定した数の IP アドレスを生成し、あるポートでそれらすべてに接続しようとするスクリプトがあります。2000 台のホストを同期的にスキャンするには時間がかかる可能性があるため、このスクリプトでは Celluloid を使用して適度な速度を実現しています。ただし、スクリプトに 2000 のランダムなホストをスキャンするように指示したとします。私が見つけたのは、実際にはその数の約半分しかスキャンしていないということです. 3000 をスキャンするように指示すると、同じ基本的な結果が得られます。1000 以下を実行すると、はるかにうまく機能するように見えますが、1000 のホストをスキャンするだけでも、通常、相対的な一貫性で約 920 しか実行されません。ランダムな IP アドレスを生成すると明らかに失敗するものがあることはわかっていますが、毎回、約 70 個の不適切に生成された IP アドレスがあるとは信じがたいです。コードは次のとおりです。
私はこれを得る約半分の時間:
D, [2014-09-30T17:06:12.810856 #30077] DEBUG -- : 11人のアクターを終了中... W, [2014-09-30T17:06:12.812151 #30077] WARN -- : 終了タスク: type=: finalizer, meta={:method_name=>: shutdown }, status=:Celluloid::TaskFiber のバックトレースを受信中です。
Celluloid.task_class = Celluloid::TaskThread
ここでバックトレースが必要な場合は試してください。
スクリプトは何もしません。残りの時間 (1000 以上を指定した場合のみ) は次のようになります: http://pastebin.com/wTmtPmc8
だから、私の質問はこれです。この特定のスクリプトで目的を達成しながら、競合状態やデッドロックを回避するにはどうすればよいですか?
ruby - ソケットおよび/または Celluloid::IO の適切な使用
私はPinoccio マイクロコントローラーを持っています(絶対に素晴らしいので試してみてください)。マイクロコントローラーは、サーバーへのソケットを開きます。私はCelluloid::IOを使用する Ruby アプリケーションでその TCP ソケット サーバーを作成しています。私のガイドとして、私はpinoccio-serverと呼ばれるノードでのこの実装に従っています
Pinoccio マイクロコントローラとの通信を試みるために、いくつかのテスト コードを作成しました。問題なく読み取ることができますが、データをソケットに書き戻すと、予期した動作が得られません。これがコードです。私がCelluloid::IOまたはソケットを誤用しているかどうか教えてもらえますか?
ruby - Ruby Celluloid: すでに進行中の Future にアタッチ
Celluloid Actor のインスタンスを指定すると、 を使用future
して Actor メソッドを非同期に実行し、後で Future のvalue
メソッドを使用して Actor メソッドの結果を取得できます (必要に応じてブロックします)。
システムに 2 つの別個のコンポーネントがあり、両方が同じ Actor メソッド (おそらく非常に高価なデータベース クエリ) を使用したいとします。これらのコンポーネントの両方が個別に呼び出されactor.future.expensive_query
た場合、クエリは 2 回実行され、各呼び出し元は独自の個別の Future オブジェクトを取得して結果を取得します。さらに、2 つのクエリは同時にではなく、シリアルに実行されます。actor.future.expensive_query
代わりに、最初の呼び出し元によって作成された Future オブジェクトへの参照を取得するためだけに を2 回呼び出したい場合はどうなるでしょうか。セルロイドでそんなことができるの?