問題タブ [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 投票する
1 に答える
1842 参照

performance - D のスレッド上のファイバー

D でスレッドとファイバーを試していますが、メイン スレッドが実行されているときに別の CPU でファイバーを実行できるかどうか疑問に思っていました。そうでない場合、スレッドではなくファイバーを使用する理由は何でしょうか。(実用的な例は大歓迎です)

しばらくしてから次のファイバーに切り替えるファイバーを使用した初期プログラムを作成しようとしました。ただし、CPU 使用率が 1 つの CPU だけにとどまっていることに気付きました。

D のドキュメントには次のように記載されています。

ファイバーが 1 つの特定のスレッドにバインドされている必要はないことに注意してください。むしろ、現在実行されていない限り、ファイバーはスレッド間を自由に通過できます。

これは、別の CPU を使用する場合、ファイバーを実行するためのスレッドを提供する必要があるということですか? だとしたら目的がわからない。

前もって感謝します!

0 投票する
5 に答える
10631 参照

ruby - Ruby(およびopen-uri)を使用して配列内のアイテムを並列処理する方法

open-uriを使用して複数の同時接続を開くにはどうすればよいですか?どういうわけか糸脱毛や繊維を使う必要があると思いますが、よくわかりません。

コード例:

0 投票する
3 に答える
2796 参照

c# - CLR でマネージド スレッドとファイバーを使用する

さて、次のリンクには、ディスカッションでサポートされておらず、文書化されていない API が使用されているという警告があります。とにかく、コードサンプルを使用しようとしています。それは主に動作します。例外に関連する以下の特定の問題についてのアイデアはありますか?

http://msdn.microsoft.com/en-us/magazine/cc164086.aspx

参考までに、元のサンプルを改良しました。「前のファイバー」へのポインターを維持していました。代わりに、以下の更新されたサンプルでは、​​すべてのファイバー クラスに渡される「メインファイバー」ポインターを使用しています。そのようにして、それらは常に主繊維に戻ります。これにより、メイン ファイバーが他のすべてのファイバーのスケジューリングを処理できるようになります。他のファイバーは、常にメインのファイバーに「屈服」します。

この質問を投稿する理由は、ファイバー内で例外をスローすることに関係しています。記事によると、CorBindToRunTime API を CreateLogicalThreadState()、SwitchOutLogicalThreadState() などで使用することにより、フレームワークはファイバーごとにマネージド スレッドを作成し、適切に例外を処理します。

ただし、含まれているコード例には、ファイバー内でマネージ例外をスローし、同じファイバー内でそれをキャッチすることを実験する UUnit テストがあります。その作品のソフト。しかし、メッセージをログに記録して処理した後、ファイバーが空のメソッドであっても他のメソッドを呼び出すと、アプリケーション全体がクラッシュするため、スタックが悪い状態にあるようです。

これは、SwitchOutLogicalThreadState() と SwitchInLogicalThreadState() が適切に使用されていないか、機能していない可能性があることを意味します。

注: この問題の手がかりの 1 つは、マネージ コードが Thread.CurrentThread.ManagedThreadId をログアウトすることであり、これはすべてのファイバーで同じです。これは、CreateLogicalThreadState() メソッドが宣伝どおりに新しいマネージド スレッドを実際に作成しなかったことを示唆しています。

これをよりよく分析するために、ファイバーを処理するために呼び出される低レベル API の順序の疑似コード リストを作成しました。ファイバーはすべて同じスレッドで実行されるため、同時に何も起こらないことを覚えておいてください。これは線形ロジックです。もちろん必要なトリックは、スタックを保存して復元することです。そこが困っているようです。

それは単純な糸として始まり、その後繊維に変わります。

  1. ConvertThreadToFiber(objptr);
  2. CreateFiber() // 複数の win32 ファイバーを作成します。

ここで、初めてファイバーを呼び出します。そのスタートアップ メソッドは次のことを行います。

  1. corhost->SwitchOutLogicalThreadState(&cookie); メイン Cookie はスタックに保持されます。
  2. SwitchToFiber(); // 初めてファイバー起動メソッドを呼び出します
  3. corhost->CreateLogicalThreadState();
  4. メインのファイバー抽象メソッドを実行します。

最終的に、ファイバーはメイン ファイバーに戻る必要があります。

  1. corhost->SwitchOutLogicalThreadState(&cookie);
  2. SwitchToFiber(ファイバー);
  3. corhost->SwitchInLogicalThreadState(&cookie); // メインのファイバー クッキーですね。

また、メイン ファイバーは既存のファイバーを再開します。

  1. corhost->SwitchOutLogicalThreadState(&cookie);
  2. SwitchToFiber(ファイバー);
  3. corhost->SwitchInLogicalThreadState(&cookie); // メインのファイバー クッキーですね。

以下は、マネージド コード用のファイバー API をラップする fiber.cpp です。

上記の fiber.cpp クラス ファイルは、Visaul c++ プロジェクトの唯一のクラスです。/CLR:oldstyle スイッチを使用して、CLR をサポートする DLL としてビルドされます。

上記の単体テストでは、次の出力が得られ、その後ひどくクラッシュします。

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

ruby - Em-synchrony サンプル コードが期待どおりに動作しない

em-synchrony のドキュメントは、このコードがファイバーを使用していることを意味するこの記事へのリンクです。

...これは、em-synchrony を使用したこのはるかに単純なコードと同等です。

ただし、2 つを実行すると、異なる結果が生成されます。最初の例では、ファイバーは HTML 応答が返されるまで処理を続けますが、2 番目の例では、応答を待たずにすぐに印刷されるように見え、その結果、印刷​​された応答は空になります。私の読み間違いやタイプミスですか、それとも記事が実際に間違ったことを示唆しているのでしょうか?

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

ruby - なぜ繊維が必要なのですか

ファイバーの場合、典型的な例があります。フィボナッチ数の生成です。

なぜここにファイバーが必要なのですか?同じProcでこれを書き直すことができます(実際にはクロージャー)

それで

まったく同じ結果が返されます。

では、繊維の利点は何ですか。ラムダやその他のクールなRuby関数ではできない、Fibersで書くことができるものは何ですか?

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

ruby - ルビーファイバーとフェイ

EventMachine、Fibers、fayeを使った簡単なスクリプトがあります

event_1が最初に来て、その隣にevent_2があります(非常に短い間隔)
それを実行してイベントが発生したとき。私はいつもこの出力を持っています:

それで全部です。
イベント1はどこで終了しますか?
私が間違っているのは何ですか?

UPD:非同期を削除するとrequire 'redis/connection/synchrony'、すべてを削除するとうまくいきます。しかし、私はこの非同期が必要です。

ルビー-1.9.2-p290[x86_64]

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

ruby - ファイバーの途中でやめた後にすべきこと

Fiber インスタンスの途中で作業を終えたらfiber、つまり、yieldそれを完了せずにそれから ed をfiber実行し、それ以上使用していない場合、どうすればよいですか? 明示的に破棄する必要がありますかkill、ファイバーのようなものがありますか、それとも適切にガベージコレクションされますか? もしそうなら、Rubyは私がfiber.resume将来行くかどうかをどうやって知るのでしょうか?

0 投票する
7 に答える
41698 参照

multithreading - node.js での同時タスクにはどれが適していますか? 繊維?ウェブワーカー?またはスレッド?

少し前に node.js に出会い、とても気に入りました。しかしすぐに、CPU を集中的に使用するタスクを実行する能力が著しく欠けていることがわかりました。それで、私はグーグルを始めて、問題を解決するためにこれらの答えを得ました:Fibers、Webworkers、Threads(thread-a-gogo)。どちらを使用するかは混乱しており、そのうちの 1 つを使用する必要があります。結局のところ、IO だけが得意で他に何もないサーバーを使用する目的は何ですか? 提案が必要です!

アップデート:

私は遅刻する方法を考えていました。それに対する提案が必要なだけです。さて、私が考えたのはこれでした: いくつかのスレッドを用意しましょう (thread_a_gogo または webworkers を使用)。より多くのものが必要な場合は、さらに作成できます。ただし、作成プロセスにはいくつかの制限があります。(システムによって暗示されているわけではありませんが、おそらくオーバーヘッドが原因です)。これで、制限を超えたときに、新しいノードをフォークして、その上にスレッドの作成を開始できます。このようにして、ある程度の限界に達するまで続けることができます (結局のところ、プロセスにも大きなオーバーヘッドがあります)。この制限に達すると、タスクのキューイングが開始されます。スレッドが解放されるたびに、新しいタスクが割り当てられます。このように、スムーズに進めることができます。

それで、それは私が考えたことでした。このアイデアは良いですか?私はこのプロセスとスレッドのすべてに少し慣れていないので、専門知識はありません。ご意見をお聞かせください。

ありがとう。:)

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

node.js - nodejs で CPU バインド タスクを実装する方法

GETパラメーターをデコードし、エンコードされた形式でデータを返すWebサーバーにnodejsを使用しています。デコード/エンコードは、同期しているように見えるnodejsのcryptoモジュールを使用して行われます。1 つの要求を処理するのにかかる時間は十分に高速ですが、イベント ループをブロックすると、サービスの同時実行性が低下します。

私の要件は単純です。エンコード/デコード機能をイベントループの外側にします。

  1. 別のプロセス (child_process または cluster)

これは、この目的のためだけに別のプロセスにすることもできますが、エンコード/デコードが子プロセスでブロックされるため、子プロセスが新しいメッセージを受信するのを停止します。つまり、2 つの文字列が子プロセスとしてエンコードされる状況は決してありません。シングルスレッドにもなります。

  1. リクエストごとに個別のスレッド (threads-a-gogo または fiber または node-webworker)

エンコード/デコード操作を実行するリクエストごとに個別のスレッドを作成しますが、どのモジュールも期待どおりに動作しないようです。つまり、threads-a-gogo は npm を介してインストールされず、ファイバーは実行時に個別のスレッドを作成しませんでした。 ()、node-webworkerが機能していません

誰かが同様の問題に直面したことがありますか、または単純なメッセージの受け渡しで nodejs でスレッドを簡単に作成する方法がありますか。

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

rspec - 複数の with_api() テストが 1 つの RSpec スイートで呼び出されると、Goliath は em-synchrony/em-hiredis を壊します

RSpec を使用して Goliath API をテストしているときに、奇妙な動作が発生しました。私のテストの1つは次のようになります。

em-synchrony/em-hiredisAPI は基本的に、次のような助けを借りて、redis でキーを検索するだけです。

両方のテストは個別に実行されますが、一緒には実行されません。最初の実行後、システム全体が約 10 秒間停止します。2 番目の with_api が呼び出されますが、get_request は実行されません。何らかのタイムアウトで実行されていると思います。

次のようにキューをプッシュおよびポップする別の非常によく似たテストで同じ動作を発見しました。

second の内容async do ..もまったく実行されません。goliath をロードしないと、非常によく似たテストが完全に実行されます。

前のasync do ..タスクの は同じ RSpec ヘルパーです。

私は一日中狂ったように探していましたが、私には意味がありません. 最後のテストはまったく問題なく実行されているため、問題でも問題でem-synchronyもないと思いem-synchrony/em-hiredisます。

ゴライアスは止まらず、EM を占有する時間が長すぎるのではないでしょうか?

助けてくれてありがとう、これは私を夢中にさせています!