問題タブ [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.
c++ - メッセージ ポンプがアイドル状態のときにハングする User32 SendMessage
サードパーティ アプリケーション用のマルチスレッド dll があります。私の dll は、カスタム メッセージ タイプで SendMessage を呼び出すことにより、メイン UI スレッドにメッセージを呼び出します。
アプリケーションは MDI で、ドキュメントを開く/コンテンツを抽出する/バックグラウンドで処理する/大量のドキュメントを保存するため、常にアクティブなドキュメントを切り替えたり、新しいドキュメントを開いたり閉じたりしています。
私の問題は、上記の InvokeSync() 関数を使用してメイン スレッドにメッセージを呼び出そうとすると、処理が停止することがあることです。
デバッガーで一時停止すると、メイン スレッドに次のコール スタックがあることがわかります。
ロックされているバックグラウンド スレッドには、次のような呼び出し履歴があります。
そのため、「SendMessage()」呼び出しでスタックしているように見えますが、私が見る限り、メイン スレッドのメッセージ ポンプはアイドル状態になっています。
ただし、非アクティブなドキュメントを (アクティブにするために) 手動でクリックすると、どういうわけかすべてが起動し、SendMessage() イベントが最終的に通過し、処理が再開されます。
メイン アプリケーションは、ドキュメントごとに 1 ファイバーの Microsoft ファイバーを使用します。SendMessage がバックグラウンド ファイバーでスタックして、スイッチ アウトされたりすることはありますか? 非アクティブまたは何かになる直前のファイバーで、コンテキストスイッチを強制することによってのみ、そのファイバーはメッセージを処理することができますか? 糸と繊維の相互作用がよくわからないので、ストローをつかんでいます。
メッセージがこのように未処理のまま放置される原因は何ですか? さらに重要なことに、この状況が発生するのを防ぐ方法はありますか? または、少なくとも、そのような状況をどのようにデバッグしますか?
c# - ファイバーと非同期待機
私は、開発者がファイバーを多用している C# プロジェクトに参加しています。このプロジェクトの前は、私はそれらについて聞いたことがなく、以前はasync await
andThreads
とBackgroundWorker
s をマルチタスク操作に使用していました。今日、なぜ s を使用したのかを彼らに尋ねたところFiber
、主な開発者は、デバッグが容易であると言いました。つまり、彼は特定の関数がどのスレッドから来たのかを知っており、スタック内の上位の変数にアクセスすることさえできます.
Fiber
s を使用することと、新しいものasync await
を使用してsを使用することの利点と欠点は何だろうと思っていましたThread
。
PS: .Net 4.5 を使用しています
ruby - ||を使用したFiber.yield
次のコードについて助けてください。
実行すると、次のように出力されます。
6 行目 = Fiber.yield(square) || 仕事?ライン全体が何をしているのかではなく、コンポーネントの部分だけを理解していると思います。(これをよりよく理解するのに役立つ別の書き方はありますか?)。
(編集: このコードは、Peter Cooper による 295 ページの「Beginning Ruby, From Novice to Professional 2nd Ed」の例をわずかに変更したものです。)
multithreading - スレッド/ファイバー - 明確化
「ファイバー」の概念について、1) スレッドと 2) カーネルから見たものとの関係について、少し混乱しています。
私の理解では、ファイバーはスレッドによって作成されたスレッドであり、そのスレッドを作成するスレッド (つまり、おそらくスケジューラ?) によって管理されます。ただし、すべての集中的な目的のために、それはまだ「スレッド」であり、カーネルからはそのように見なされると考えています。
私が同僚から受け取った説明によると、ファイバーはカーネルからは完全に見えず、完全にユーザー空間で実行され、決して「スレッド」ではありません。彼のメールによると:
スレッドは、ユーザー空間ライブラリに実装されることがあるため、ユーザー スレッドと呼ばれます。カーネルはそれらを認識しないため、ユーザー空間で管理およびスケジュールされます。一部の実装では、マルチプロセッサ マシン (M:N モデル) の利点を得るために、ユーザー スレッドを複数のカーネル スレッドの上に置きます。この記事では、「スレッド」という用語 (カーネルまたはユーザー修飾子なし) は、デフォルトでカーネル スレッドを指します。仮想マシンによって実装されるユーザー スレッドは、グリーン スレッドとも呼ばれます。一般に、ユーザー スレッドは高速に作成および管理できますが、マルチスレッドまたはマルチプロセッシングを利用することはできず、実行の準備ができているユーザー スレッドがいくつかある場合でも、関連するすべてのカーネル スレッドがブロックされるとブロックされます。
ファイバーは、協調的にスケジュールされるスケジューリングのさらに軽い単位です。実行中のファイバーは、別のファイバーを実行できるように明示的に「譲歩」する必要があります。これにより、カーネルまたはユーザースレッドよりも実装がはるかに簡単になります。ファイバーは、同じプロセス内の任意のスレッドで実行するようにスケジュールできます。これにより、アプリケーションはカーネル スケジューラ (アプリケーションに合わせて調整されていない可能性があります) に依存するのではなく、スケジューリング自体を管理することでパフォーマンスを向上させることができます。OpenMP などの並列プログラミング環境は、通常、ファイバーを介してタスクを実装します。コルーチンはファイバーと密接に関連しており、コルーチンは言語レベルの構造体であるのに対し、ファイバーはシステムレベルの構造体であるという違いがあります。
ファイバーが正確に何であるかという点で、もう少し良い説明を得たいと思っています(OS /カーネルに関する限り、実際のスレッドであり、作成するスレッドによって単純に管理されますか?)。
Google 検索で広範囲に調査しましたが、ここを含め、どこを見ても単純な答えが 1 つしか見つかりませんでした。「ファイバーは、スレッドによって作成および管理されるスレッドです。」
誰かが共有したり、私に指摘したりできる情報があれば、それは大歓迎です. 私の同僚の主張は、Golang のゴルーチンは「ファイバー」を使用し、それらのファイバーは OS からは見えないというものです。したがって、ファイバーの「正しい」実装です。個人的には、ゴルーチンはコルーチンとより密接に関連していると感じており、ファイバー/スレッドのシナリオをまったく実装していません...
meteor - Meteor: 建物の問題。エラー モジュール「ファイバー」が見つかりません
私たちは流星のアプリケーションを持っています。コマンドを使用し
meteor build .
てビルドされています。次に、上記の手順で作成された tar.gz を抽出し、main.js の場所まで移動します。node main.js を実行すると、次のエラーが発生します。
このアプリケーションを実行できません。誰かが何かを提案できますか
javascript - ノード ファイバーをインストールしようとしたときのエラー
インターネットに接続されていない Windows サーバーに Meteor アプリで使用するノード ファイバーをインストールしようとしています。programs/server/node_modules/fibers
パッケージのreadmeに従って、ファイバーファイルをgithubからディレクトリに手動でコピーしました。私は今npm install --verbose
、そのディレクトリから実行しようとしています。次のエラーが表示されます。
サーバーに既にノード v0.10.40 がインストールされていることに注意してください (node -v
これを確認します)。そのため、このバージョンをインターネットから再度ダウンロードしようとする理由がわかりません。
ruby - FiberError: em-synchrony を使用して「スレッド間で呼び出されたファイバー」
sidekiq ワーカー内で em-synchrony と em-http-request (Ruby 2.1) を使用して、多数のリンクを同時にスクレイピングしています。スクレーパーで同時に複数のワーカーを実行しようとする場合を除いて、すべてがうまく機能します。これは私が使用しているコードです:
複数のインスタンスを同時に実行してこのワーカー プロセスを実行すると、最終的に次のエラーがスローされます。
multithreading - 繊維の収量を呼ばないとどうなりますか?
私がドキュメントyield()
機能から理解しているように、制御を別のファイバーに渡しています。D でファイバーの歩留まりを呼び出さないとどうなりますか? スレッドがハングするということですか?
または、繊維がスレッド内で機能し、プロセス内で機能することを間違って理解していますか? そして、プロセスは orthreads
またはfibers
?を持つことができます。