問題タブ [fibers]

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.

0 投票する
0 に答える
100 参照

javascript - Node.js ファイバーのブロックを設定する方法

node-mongodb-native を使用して、より同期された db モジュールを作成しようとしています。現在、db.open のファイバー化で立ち往生しています。

助言がありますか?ありがとう。

0 投票する
2 に答える
721 参照

ruby - Ruby 1.9.3-p140-スレッドの使用-すべての結果がスレッドから出力されるのを待つ方法は?

メインスレッドが終了する前に、すべてのスレッドが実行されるのを待つ良い方法を見つけようとしています。

次のコードでそれを行うにはどうすればよいですか?

プログラムは私がスレッド番号XXXです。私の乱数は、メインスレッドのほぼ最後にあるwhileループのドットとYYYで混合されています。whileループを使用しない場合、プログラムはスレッドが終了する前に終了します。

0 投票する
1 に答える
1357 参照

ruby - Ruby 1.9.3-p140-Rubyプログラムのスレッドの最大数?

スレッドで遊んでいて、10000スレッドを実行できないことがわかりました。

次のエラーが発生します。

次に、最大数を確認しようとしました。最大2046スレッドを作成すると、Rubyがコードを実行します。

なぜ2046年なのか?512、1024、2046などのメモリパターンに従っているようです...

threading.rbコード:

0 投票する
0 に答える
458 参照

ruby-on-rails - Tomcat で JRuby/Rails アプリに Rack::FiberPool と EventMachine を使用するには?

Rack::FiberPoolEventMachineを使用した JRuby/Rails アプリがあります。そして、私はいくつかのイベントベースのアクションコントローラーを持っています:

シンサーバーで手動で実行すると正常に動作します:

しかし、Tomcat にデプロイすると機能しません。TomcatでEventMachineを使用する方法はありますか?

ありがとう。

0 投票する
1 に答える
1274 参照

ruby - http リクエストを正しくスロットルする必要がある

イベント化されたサブスクリプションを介してキューからメッセージをプルするコンシューマーがあります。これらのメッセージを受け取り、かなり遅い http インターフェイスに接続します。8 つのワーカー プールがあり、それらがすべていっぱいになったら、キューからの要求のプルを停止し、http ジョブで動作しているファイバーを動作させ続ける必要があります。これが私が一緒に投げた例です。

Synchrony ブロックの while ループ内で sleep を呼び出すと、reactor ループが動かなくなることがわかりました。if ステートメント内で sleep を呼び出すと (1 回だけスリープする)、ほとんどの場合、要求が完了するのに十分な時間ですが、せいぜい信頼性が低くなります。EM::Synchrony.sleep を使用すると、メインのリアクター ループが新しい要求を作成し続けます。

メインループを一時停止し、ファイバーの実行を終了させる方法はありますか?

0 投票する
1 に答える
425 参照

ruby - Ruby IO ライブラリを非同期バージョン + ファイバーに置き換える

すべての ruby​​ IO クラスを、バックグラウンドでリアクターとファイバーを使用する別の実装に置き換えることは可能ですか? 実際、ネイティブの Ruby IO を使用するすべてのライブラリは期待どおりに動作します。これは、IO へのすべての呼び出しがファイバーでラップされ、要求された操作を待機するためです。しかし、接続/ファイルでデータが利用可能になるのを待っている間、ruby は他の io 操作を提供します。

0 投票する
1 に答える
3919 参照

ruby - EventMachine と Ruby ファイバーによる非同期呼び出しの待機

Ruby 1.9.2 で次のコード スニペットを実行しています。

出力が「ABCD」になり、プログラムが「A」の後に 2 秒間一時停止することを期待しています。ただし、代わりに「AC」をすぐに出力し、終了する前に 2 秒間待機します。私は何を間違っていますか?

(参考までに、em-synchrony を使用せずに、この記事で説明されている em-synchrony スタイルの動作を再現しようとしています。)

編集: ここで、私が最終的に達成しようとしていることについての詳細をいくつか示します。Thin で動作する Grape API を開発しています。各ルート ハンドラは、応答を返す前に、データストア、ZooKeeper、その他の HTTP サービスなどに対してさまざまな呼び出しを連続して行う必要があります。

em-synchrony は非常に優れていますが、ルート ファイバーからの降伏や、上記の場合の非同期の症状を示す結果に関する問題に直面し続けています。rack-fiber_pool も潜在的に役立つように思えますが、すぐに使用できるようにすると、すべての Rack::Test 単体テストが壊れてしまうため、これを使用することにコミットするのは気が進まないのです。

ファイバーと EventMachine を一緒に使用する方法について根本的な誤解があり、より複雑なフレームワークを効果的に使用できないように思われるため、問題を上記の単純な例にまとめました。

0 投票する
0 に答える
115 参照

ruby - バックグラウンドでRuby実行中のプロセス

MP3 を再生する小さなコンソール アプリケーションを作成しようとしています。mp3 の再生は mpg123 などの外部バイナリによって処理され、再生コントロール、プレイリストなどは curses コンソール アプリとして実装されます。

多くのトラックが追加された「プレイリスト」オブジェクトを作成するとします。トラックを再生するときは、バックグラウンドでバイナリを呼び出し、UI をレスポンシブにする必要があります。次のトラックなどにスキップできるようにする必要もあります。

これにはスレッドまたはファイバーを使用する必要があると思いますか? スレッドを制御するにはどうすればよいですか?

私はこれまでスレッド化された Ruby プログラミングを行ったことがありません。

これを始める方法の簡単な例はありますか?

0 投票する
2 に答える
1173 参照

ruby - Ruby のファイバー 4kB スタック サイズの結果

繊維は私にとって比較的新しい概念です。各ファイバーのスタック サイズが 4kB に制限されていることを認識しており、これに「注意」する必要があることを読み続けています。この制限の実際の結果は正確には何ですか?

編集:

結局、この 4kB の制限はそれほど障害にはならないようで、SystemStackError を発生させるにはファイバー自体の内部にかなりの数 (4,045) のローカル変数が必要です。

最も洗練されたコードではありませんが、ファイバーのスタックの限界を示しているようです。戻り値、ローカル変数 (すべてヒープ上のオブジェクトへの参照を含む)、およびメソッド呼び出しだけがスタックに置かれるようです。ファイバーから呼び出されるメソッドのローカル変数などがファイバーのスタックの一部であるかどうかはテストしていません。

編集2:

上記のコードを修正しました。呼び出されたメソッドの変数などは、ファイバーのスタックの一部になるようです。この場合、メソッド自体が変数 (ヒープ上のオブジェクトへの透過的な参照であるように思われる) よりも多くのスペースをスタック上に必要とする可能性が高いため、呼び出しの深さ (再帰がなくても) がより大きな問題になる可能性があります。

次のコードは 4,031 回目の反復で失敗し、呼び出されたメソッドの変数がファイバーのスタックの一部になることを示しています。

編集3:

Rubinius 2.0 で最初のコード例を実行してみました。そのファイバーには 4kB のスタック制限がないように見えますが、約 3,500 回の反復を超えるとますます著しく遅くなり、5,000 回目の反復では平均して 1 秒あたり約 1 回の反復になります。5,100 回を少し超えた時点で実行を終了したため、RBX に制限があるかどうかはわかりません。また、RBX は MRI 1.9.3 の数倍のメモリを使用しています。

JRuby 1.7 では、ファイバーのスタック サイズが 4kB に設定されていないようです。また、ファイバーに最大スタック サイズがあるかどうかは不明です。最初のコード例の 5,000 回の反復を問題なく完了しましたが、予想どおり、JVM は数百 MB の RAM を食い尽くしました。