web-dev-qa-db-ja.com

nodejsでスレッドを作成する方法

一度に複数のメソッドを実行するためのスレッドを作成する方法はありますか。いずれかのメソッドが失敗した場合、他のすべてのスレッドを終了する必要があります。
前もって感謝します

83
user87267867

すべてのnode.jsプロセスは、設計によりシングルスレッド化されています。したがって、複数のスレッドを取得するには、複数のプロセスが必要です(他のポスターが指摘しているように、リンクできるライブラリもあり、Nodeでスレッドを操作できるようになりますが、それらのライブラリがないとそのような機能はありません。 https://github.com/audreyt/node-webworker-threads )を参照するShawn Vincentの回答を参照してください。

Node.jsのドキュメントに示されているように、メインプロセスから子プロセスを開始できます: http://nodejs.org/api/child_process.html 。このページの例は非常に優れており、非常に簡単です。

その後、親プロセスは、開始したプロセスの終了イベントを監視し、開始した他のプロセスを強制終了して、話している1つすべての停止戦略を達成できます。

参照: マルチコアマシンのNode.js

89
Brian

Node.js内からネイティブスレッドを実行するための少なくとも1つのライブラリ:node-webworker-threads

https://github.com/audreyt/node-webworker-threads

これは基本的に、node.jsの Web Worker browser API を実装します。

33
Shawn Vincent

Node 10.5からマルチスレッドのサポートが追加されました ですが、experimentalです。これがすぐに安定することを願っています。

以下のリソースをチェックアウトします。


更新

Nodev11.7.0以降では、--experimental-workerフラグを使用する必要はありません。

リリースノート: https://nodejs.org/en/blog/release/v11.7.0/

16
user158

Napa.jsを使用してマルチスレッドを取得できます。

https://github.com/Microsoft/napajs

「Napa.jsはV8上に構築されたマルチスレッドJavaScriptランタイムです。これはもともとBingで妥協のないパフォーマンスを備えた高度に反復的なサービスを開発するために設計されました。 Napa.jsはNode.jsモジュールとして公開されていますが、Node.jsに依存せずにホストプロセスに埋め込むこともできます。」

9
shmuli

Rxを使用している場合、rxjs-clusterにプラグインして作業を並列実行に分割するのはかなり簡単です。 (免責事項:私は著者です)

https://www.npmjs.com/package/rxjs-cluster

4
Jonathan Dunlap

https://github.com/xk/node-threads-a-gogo もありますが、プロジェクトのステータスについてはわかりません。

2
shaunc

Node.jsで real マルチスレッドが必要で、が私のために働いたものスレッドでした パッケージ。 Node.jsの独自のメッセージループを持つ別のプロセスが生成されるため、お互いをブロックしません。セットアップは簡単で、ドキュメントを使用すればすぐに実行できます。メインプログラムとワーカーは両方の方法で通信でき、必要に応じてワーカーの「スレッド」を強制終了できます。

マルチスレッドとNode.jsは複雑で広く議論されているトピックであるため、 my の特定の要件に対応するパッケージを見つけることは非常に困難でした。レコードについては、これらのdは私には機能しませんでした

  • tiny-worker はワーカーの生成を許可しましたが、同じメッセージループを共有しているように見えました(しかし、何か間違ったことをした可能性があります- threads にはドキュメントがありました) 本当に複数のプロセスを使用したので、自信が持てるようになりました。
  • webworker-threads は、必要なワーカーでrequire- ingモジュールを許可しませんでした

そして、 real マルチスレッドが必要な理由を尋ねる人たちのために:Raspberry Piと割り込みを含むアプリケーションの場合。 1つのスレッドがこれらの割り込みを処理しており、別のスレッドがデータ(およびその他)の保存を処理しています。

2

NodeJSに threads が含まれるようになりました(応答時の実験的機能として)。

2
James Holmes

Promise.race (スレッドではなくネイティブI/Oレーシングソリューション)を探しているかもしれません

あなた(またはこの質問を検索している他の人)がスレッドを競合させて障害を回避し、I/O操作のコストを回避すると仮定すると、これは(スレッドを使用しない)シンプルでネイティブな方法です。 Nodeはシングルスレッド(イベントループを検索)になるように設計されているため、可能であればスレッドの使用は避けてください。私の仮定が正しい場合、setTimeoutPromise.raceを使用することをお勧めします(リンクの例)。この戦略では、各I/O操作を試行するプロミスのリストを競い、エラーがある場合はプロミスを拒否します(そうでない場合はタイムアウトします)。 Promise.raceステートメントは、最初の解決/拒否の後も継続します。これが誰かを助けることを願っています!

1
smileham

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 run start

Hello from worker 4
Hello from worker 3
Hello from worker 1
Hello from worker 2
Hello from worker 5
0
Priyesh Diukar

Node.jsはスレッドを使用しません。その発明者によると、それは重要な機能です。発明の時点では、スレッドは遅く、問題があり、困難でした。 Node.jsは、効率的なシングルコアの代替案の調査の結果として作成されました。ほとんどのNode.jsファンは、過去50年にわたってスレッドが改善されていないかのように、古い引数を引用しています。

ご存知のように、Node.jsはJavaScriptの実行に使用されます。 JavaScript言語も長年にわたって開発されてきました。現在、複数のコアを使用する方法があります-スレッドが行うこと。そのため、JavaScriptの進歩により、アプリケーションでいくつかのマルチコアマルチタスクを実行できます。 user158はNode.jsが少し遊んでいると指摘しています。私はそれについて何も知りません。しかし、なぜNode.jsがJavaScriptが提供するものを承認するのを待つのでしょうか。

Node.jsマルチスレッドではなく、JavaScriptマルチスレッド用のGoogle。 Web Workers、Promise、その他のことについて知ることができます。

0
Roger F. Gay