一度に複数のメソッドを実行するためのスレッドを作成する方法はありますか?
そうすれば、他のすべてのスレッドの間に何らかのメソッドが失敗した場合は、強制終了する必要があります。
一度に複数のメソッドを実行するためのスレッドを作成する方法はありますか?
そうすれば、他のすべてのスレッドの間に何らかのメソッドが失敗した場合は、強制終了する必要があります。
回答:
すべてのnode.jsプロセスは、設計によりシングルスレッドです。したがって、複数のスレッドを取得するには、複数のプロセスが必要です(他のポスターが指摘しているように、リンクできるライブラリもあり、Nodeでスレッドを操作する機能を提供しますが、これらのライブラリがなければそのような機能はありません)。https://github.com/audreyt/node-webworker-threadsを参照するShawn Vincentの回答を参照してください)
node.jsのドキュメントhttp://nodejs.org/api/child_process.htmlに示されているように、メインプロセスから子プロセスを開始できます 。このページの例は非常に優れており、非常に簡単です。
親プロセスは、開始したプロセスの終了イベントを監視し、開始した他のプロセスを強制終了して、話しているすべての停止戦略のタイプを達成できます。
Node.js内からネイティブスレッドを実行するための少なくとも1つのライブラリ:node-webworker-threadsもあります。
https://github.com/audreyt/node-webworker-threads
これは基本的に、node.js用のWeb WorkerブラウザーAPIを実装します。
ノード10.5以降、マルチスレッドのサポートが提供されていますが、試験的なものです。これがすぐに安定することを願っています。
以下のリソースをチェックアウトします。
更新:
ノードv11.7.0以降では、--experimental-worker
フラグを使用する必要はありません。
リリースノート:https : //nodejs.org/en/blog/release/v11.7.0/
Napa.jsを使用してマルチスレッドを取得できます。
https://github.com/Microsoft/napajs
「Napa.jsは、V8に基づいて構築されたマルチスレッドのJavaScriptランタイムであり、もともとはBingで妥協のないパフォーマンスを備えた高度に反復的なサービスを開発するために設計されました。 、JavaScriptを複数のV8アイソレートで実行し、それらの間で通信する機能を備えています。Napa.jsはNode.jsモジュールとして公開されていますが、Node.jsに依存せずにホストプロセスに埋め込むこともできます。」
Rxを使用している場合、作業を並列実行に分割するためにrxjs-clusterにプラグインするのはかなり簡単です。(免責事項:私は著者です)
Node.jsで実際のマルチスレッド化が必要でしたが、うまくいったのはスレッドパッケージでした。独自のNode.jsメッセージループを持つ別のプロセスを生成するため、お互いをブロックしません。設定は簡単で、ドキュメントを使用すると、すばやく起動できます。メインプログラムとワーカーは両方の方法で通信でき、必要に応じてワーカーの「スレッド」を強制終了できます。
マルチスレッドとNode.jsは複雑で広く議論されているトピックであるため、私の特定の要件を満たすパッケージを見つけるのは非常に困難でした。記録のために、これらは私にとってはうまくいきませんでした:
require
、必要なワーカーのモジュールを-ing できませんでしたそして、なぜ私が本当のマルチスレッディングを必要としたのかを尋ねる人のために:Raspberry Piと割り込みを含むアプリケーション用 1つのスレッドがこれらの割り込みを処理し、別のスレッドがデータ(およびその他)の格納を処理します。
nodejs 10.5.0リリースは、Node.jsでのマルチスレッド化を発表しました。この機能はまだ実験段階です。現在、新しいworker_threadsモジュールが利用可能です。
Node.js v10.5.0以降を実行すれば、ワーカースレッドの使用を開始できますが、これは試験的なAPIです。デフォルトでは使用できません。Node.jsを呼び出すときに--experimental-workerを使用して有効にする必要があります 。
ES6とworker_threadsを有効にして、バージョン12.3.1でテストした例を以下に示します。
//package.json
"scripts": {
"start": "node --experimental-modules --experimental- worker index.mjs"
},
次に、worker_threadsからWorkerをインポートする必要があります。注:ES6をサポートするには、拡張子が「.mjs」のjsファイルを宣言する必要があります。
//index.mjs
import { Worker } from 'worker_threads';
const spawnWorker = workerData => {
return new Promise((resolve, reject) => {
const worker = new Worker('./workerService.mjs', { workerData });
worker.on('message', resolve);
worker.on('error', reject);
worker.on('exit', code => code !== 0 && reject(new Error(`Worker stopped with
exit code ${code}`)));
})
}
const spawnWorkers = () => {
for (let t = 1; t <= 5; t++)
spawnWorker('Hello').then(data => console.log(data));
}
spawnWorkers();
最後に、workerService.mjsを作成します
//workerService.mjs
import { workerData, parentPort, threadId } from 'worker_threads';
// You can do any cpu intensive tasks here, in a synchronous way
// without blocking the "main thread"
parentPort.postMessage(`${workerData} from worker ${threadId}`);
出力:
npm実行開始
Hello from worker 4
Hello from worker 3
Hello from worker 1
Hello from worker 2
Hello from worker 5
プロジェクトのステータスは不明ですが、現在はhttps://github.com/xk/node-threads-a-gogoもあります。
あなたは探しているかもしれませんPromise.race
(スレッドではなくネイティブI / Oレーシングソリューション)
あなた(またはこの質問を検索している他の人)がスレッドを競合させて失敗を回避し、I / O操作のコストを回避したいと仮定すると、これは(スレッドを使用しない)シンプルでネイティブな方法です。ノードはシングルスレッド(イベントループを検索)として設計されているため、可能であればスレッドの使用を避けます。私の仮定が正しい場合、(リンクの例)で使用Promise.race
することをお勧めしますsetTimeout
。この戦略では、いくつかのI / O操作を試行するプロミスのリストを競合させ、エラーがある場合(そうでない場合はタイムアウト)、プロミスを拒否します。Promise.race
声明は、あなたが望むもののようです第1解像度/拒否、後に続きます。これが誰かを助けることを願っています!
Node.jsはスレッドを使用しません。その発明者によると、それは重要な機能です。その発明の時点で、スレッドは遅く、問題が多く、困難でした。Node.jsは、効率的なシングルコアの代替策を調査した結果作成されました。ほとんどのNode.js愛好家は、過去50年にわたってスレッドが改善されていないかのように、古い議論を引用しています。
ご存じのとおり、JavaScriptの実行にはNode.jsが使用されます。JavaScript言語も長年にわたって開発されてきました。これで、複数のコアを使用する方法、つまりスレッドの機能が追加されました。したがって、JavaScriptの進歩により、アプリケーションでマルチコアマルチタスクを実行できます。user158は、Node.jsが少し遊んでいることを指摘しています。それについては何も知りません。しかし、なぜNode.jsがJavaScriptが提供するものを承認するのを待つのですか?
Node.jsマルチスレッドではなく、JavaScriptマルチスレッド用のGoogle。Webワーカー、プロミス、およびその他のことについて調べます。