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

c - ucontext_t の uc_link にスワップするときの swapcontext segfaults

私は、通常の makecontext/swapcontext ルーチンを使用して、C で小さな概念実証ファイバー ライブラリを作成することに取り組んでいますが、それは私にいくつかの問題を引き起こしています (私のプラットフォームは OSX 10.9 Mavericks で、 を使用していclang-503.0.40ます)。

私が扱っているデータ構造は次のとおりです。

これがミニライブラリです (3 つの関数fiber_init、、、fiber_runおよびfiber_yield:

ただし、ファイバー内で fiber_yield() を呼び出すと、コンテキストが呼び出し元のコンテキストと適切に交換されないようです (参照はファイバー コンテキストの uc_link に格納されます。current_fiber->context.uc_link内を参照fiber_yield) 。

このプログラムを実行した痕跡:

出力が得られます:

OSXにはスタックアラインメント制限(16バイト境界まで)があることを読みましたがmalloc、スタックを割り当てるために使用しています。これにより、16バイト境界にアラインされたブロックが返されます(または読んだことがあります)。そうは言っても、宣言の順序を並べ替えるとセグメンテーション違反が発生しない場合があるようですが、非常に偽りであり、再現するのは困難です。

swapcontextfiber_yieldを呼び出す直前に調べると、current_fiber->contextスタック サイズが非常に大きいことがわかります。必要以上に大きくなります。おそらく、これは腐敗の兆候です。

何が起こっているのか手がかりはありますか?ありがとう!

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

ruby-on-rails - ファイバーローカル変数とスレッドローカル変数

レールのスレッドローカル変数よりもファイバーローカル変数をいつ使用するかについて、私は非常に混乱しています。私の使用例は次のとおりです。
レールにコントローラーがあり、GET 要求で計算を行い、結果 (整数のリスト) をファイバーまたはスレッドのローカル変数に格納します。これを行う必要があるのは、この計算結果を、コントローラーによって作成される可能性のあるモデルで超過できるようにするためです。この計算はGETリクエストごとに実行する必要があるため、セッションに保存したくありません。また、コントローラーの GET メソッドが完了する直前に、ファイバー/スレッド ローカル変数をクリアします。

ここで、Fiber と Thread の両方がまったく異なるため、ストレージ変数が異なることがわかります。誰がどの種類の変数をいつ使用するか説明できますか?

実際、私の理解は次のとおりです.2つのリクエストが同じファイバー/スレッドで同時に処理されることはないようです。したがって、リクエストスコープに入れたい値がある場合は、どちらでもかまいません。私の説明は正しいですか?

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

asynchronous - Meteor で wrapAsync を使用する方法

Meteor を使用して wrapAsync を適切に使用する方法がわかりません。現在、node-apac と Amazon Product Advertising API を使用しています。

次のコードを実行しようとしている場合、非同期で実行するにはどうすればよいですか。

いくつかのビデオを見ようとしましたが、うまくいきません

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

java - Quasar のファイバーのブロッキング IO はスレッドプールのスレッドをブロックしますか?

私の知る限り、Akkaでは、すべてのアクターがスレッドのプールでスケジュールされています。ブロッキング IO を同時に実行するアクターが多すぎると、各ブロッキング呼び出しが 1 つのスレッドをブロックし、スレッドの停止につながります。

現在、私は JVM での興味深いファイバーの実装 ( Quasar ) を検討しています。これは、多くのユーザー スレッド (ファイバー) を許可し、スレッド プールを使用してそれらをスケジュールします。ただし、多くのファイバーが従来のブロッキング API を呼び出すことに利点があるかどうかは疑問です。

ブロッキング API は依然としてシステム スレッドをブロックし、Quasar はそれを魔法のようにファイバーのみをブロックするように変えることができなかったので、それは役に立たないと思います。あくまで私の推測ですので、間違っていたらご指摘ください。

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

node.js - 自己ホスト Meteor アプリのファイバーの問題

おはよう

ここ数日間、この問題に悩まされていましたが、サポートやドキュメントがないことに本当に不満を感じています。私のエラーは以下です:

/usr/share/nginx/html/bundle/programs/server/node_modules/fibers/future.js:245 throw(ex); ^ エラー: モジュールは自己登録しませんでした。Error (native) at Module.load (module.js:355:32) at Function.Module._load (module.js:310:12) at Module.require (module.js:365:17) at require (module .js:384:17) の Object.Npm.require (/usr/share/nginx/html/bundle/programs/server/boot.js:142:18) の packages/npm-node-aes-gcm/wrapper. js:2:1 at /usr/share/nginx/html/bundle/programs/server/packages/npm-node-aes-gcm.js:33:4 at /usr/share/nginx/html/bundle/programs/ server/packages/npm-node-aes-gcm.js:42:3 at /usr/share/nginx/html/bundle/programs/server/boot.js:222:10 エラー:永久に検出されたスクリプトがコードで終了しました:1

ファイバー -v 1.0.5 ノード -v 0.12.4 流星 -v 1.1.0.2

どんな助けでも大歓迎です

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

c++ - Windows、TIB、および例外でのスタックの変更

私の質問の起源は、ユーザー提供のスタックをサポートする Windows で pthreads の実装を提供したいという事実から生じています。具体的には、pthread_attr_setstack意味のあることを行う必要があります。私の実際の要件はこれよりも少し複雑ですが、投稿の目的にはこれで十分です。

ファイバーまたはスレッド API でスタックを提供するためのパブリック Win API はありません。卑劣なバックドア、回避策、ハックを探し回ったが、何も進んでいない. 実際、winpthread のソースがインスピレーションを得ており、pthread_attr_setstack.

代わりに、次の「解決策」を試して、うまくいくかどうかを確認しました。と の通常の組み合わせを使用してファイバーを作成ConvertThreadToFiberCreateFiberExますSwitchToFiberCreateFiberEx最小スタック サイズを指定します。ファイバーのエントリ ポイントで、スタックにメモリを割り当て、TIB フィールドの「スタック ベース」と「スタック リミット」を適切に変更します (こちらを参照してください: http://en.wikipedia.org/wiki/Win32_Thread_Information_Block ) 。 ESP をスタックの上位アドレスに設定します。

(実際には、スタックをこれよりも適切にセットアップし、EIP も変更して、このステップが posix funciton のように動作するようにしswapcontextますが、アイデアは得られます)。

この別のスタックでOS呼び出しを行うと、かなり失敗します(printfたとえば、死ぬ)。しかし、これは私にとって問題ではありません。カスタム スタック上では確実に呼び出しを行わないようにすることができます (そのため、実際の要件はもう少し複雑であると言ったのです)。例外...私は働くために例外が必要です。そして、彼らはしません!具体的には、変更されたスタックで例外をスローしてキャッチしようとすると、アサートが発生します

0xXXXXXXXX で未処理の例外が発生しました ....

だから私の(漠然とした)質問は、例外とカスタムスタックがどのようにうまく連携しないかについて、誰か洞察を持っている人はいますか? これは完全にサポートされておらず、nil 応答または「立ち去る」以外は問題ありません。実際、私は別の解決策が必要であるとほぼ判断しており、これには妥協が伴いますが、別の解決策を使用する可能性があります。しかし、好奇心に負けてしまうので、なぜうまくいかないのか知りたいです。

これに関連して、Cygwin が ucontext でこれをどのように処理したのか疑問に思いました。ここのソースhttp://szupervigyor.ddsi.hu/source/in/openjdk-6-6b18-1.8.13/cacao-0.99.4/src/vm/jit/i386/cygwin/ucontext.cGetThreadContext/SetThreadContextを使用して実装します無文脈。ただし、実験から、新しいコンテキスト内から例外がスローされた場合にも失敗することがわかりました。実際、SetThreadContext呼び出しは TIB ブロックを更新しません!

編集(@avakarからの回答に基づく)

次のコードは、あなたのものと非常によく似ていますが、同じ失敗を示しています。違いは、中断された 2 番目のスレッドを開始するのではなく、中断してからコンテキストを変更しようとすることです。このコードは、try-catch ブロックが でヒットしたときに説明したエラーを示していますfoo。おそらく、これは単に合法的ではありません。注目すべきことの 1 つは、この状況でExceptionListは、TIB のメンバーが呼び出されたときに有効なポインターmodifyThreadContextであるのに対し、あなたの例では -1 であるということです。これを手動で編集しても役に立ちません。

あなたの答えに対する私のコメントで述べたように。これはまさに私が必要としているものではありません。現在のスレッドからコンテキストを切り替えたいと思います。SetThreadContextただし、アクティブなスレッドでこれを呼び出さないように警告するためのドキュメント。したがって、以下のコードが機能しない場合、単一のスレッドで機能させる可能性はないと思います。

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

node.js - node.js でファイバーを使用する際の潜在的な問題は何ですか?

node.js でファイバーの使用を実験する予定はありますか? 考慮すべき潜在的な問題は何ですか? イベントループのシンプルさと node.js のシングルスレッド設計の優れた設計とは正反対のファイバーのように見えます。