繊維は新しい発明ではない
ノードファイバーは、現在実行中の環境の状態をプラットフォームに依存する方法で最低レベルに保存することにより、任意の機能の実行を一時停止することを可能にします (たとえば、Windows にはファイバーの概念があり、広く使用されておらず、スレッドよりも軽量であり、先制)。
他のライブラリは、言語機能を使用してコルーチンをシミュレートします
他のすべての js ライブラリは、コールバック関数を使用してコルーチン継続を実装し、実行状態をスコープ変数に格納します。これは、コールバック ピラミッド、Promise チェーン、または async/await (装飾されたジェネレーターを async/await と同じバケットに入れました) のいずれかがあることを意味します。
ファイバーは、コルーチンの可能な実装でもあります。ファイバーは高速である必要があり、それらをコードに統合するために、別のコード スタイルで記述したり、新しい構文を導入したりする必要はありません。独自のコードから自由に変更できる実行コンテキスト (スタック、レジスタなど)。
これは純粋な JavaScript では実行できません。ノード ファイバーはネイティブ ライブラリを使用してこれを実現します。
ノード ファイバーがユーザーを制限するため、イベント ループをブロックしません。
ノード ファイバー固有の概念は次のとおりです。javascript イベント ループはすべてのファイバーの外側にあるため、最初のコードもファイバーなしで実行されます。ファイバー参照がある場合は、実行する権利を で渡すことができますfiber.run();
。ファイバーの内部にいる場合、呼び出すことで実行する権利を放棄することができFiber.yield();
(現在実行中のコードを効果的に中断します)、javascript イベント ループが続行されます。すべての組み込みコールバック ( setTimeout
、Promise.then
、イベント ハンドラー、http 要求コールバック) は、ファイバーなしで JavaScript イベント ループで実行されます。
この例を参照してください
const Fiber = require("fibers");
function findDataAsync(param, callback) {
setTimeout(() => {
callback(null, "Async returned data");
}, 100);
}
function findData( param ) {
const currentFiber = Fiber.current;
var response = null;
findDataAsync(param, function (err, data) {
response = { err : err, data : data };
currentFiber.run();
});
Fiber.yield();
if (response.err) {
throw response.err;
} else {
return response.data;
}
}
function main() {
console.log("Inside fiber started");
console.log(findData());
console.log("Inside fiber finished");
}
console.log("Outside fiber started");
Fiber(main).run();
console.log("Outside fiber finished");
これにより、次のように出力されます。
Outside fiber started
Inside fiber started
Outside fiber finished
Async returned data
Inside fiber finished
Outside fiber finished
ファイバーの最初の利回りが呼び出された直後に記録されることに注意してください。
ご覧のとおり、できるようにするために、ファイバーをすぐに開始する必要がありましたyield
。サード パーティのライブラリでファイバーを使用しようとする場合は、setTimeout
非同期の http 要求を呼び出したり発行したりして、ライブラリが現在の実行コンテキストを JavaScript イベント ループに「リセット」しないようにする必要があります。