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


91

一度に複数のメソッドを実行するためのスレッドを作成する方法はありますか?

そうすれば、他のすべてのスレッドの間に何らかのメソッドが失敗した場合は、強制終了する必要があります。

回答:


94

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

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

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

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


プロセスは同時に並行して順次実行できますか?
user87267867

2
子プロセスは、親プロセスから独立しています。独自のメモリ空間、PID、実行時間があります。シーケンシャルとはどういう意味かはわかりませんが、はい、それらは並行して実行され、OSによって個別にスケジュールされて実行されます。
Brian

子プロセスとしてユーザー定義関数を呼び出す方法?
user87267867 2013

子プロセスを生成して関数abc(){}を呼び出す方法
user87267867

2
ええと、そのライブラリを認識していませんでしたが、Alex Millsのコメントに従って、Nodeでいくつかのスレッド処理を実行できるように見えます。そうは言っても、次の質問はあなたがすべきかです。。。Nodeは、スレッドに付随する複雑さからプログラマーを解放するまでゼロから設計されましたが、I / Oをブロックするために同様のタイプのパフォーマンスをもたらします。参照されたライブラリを使用して可能であるという事実を考慮して、私の回答を編集します。
ブライアン

34

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

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

これは基本的に、node.js用のWeb WorkerブラウザーAPIを実装します。


3
これは正しいはずです。ノードがプロセスを生成できるがスレッドは生成できないことを示唆する答えは間違っています。
Alexander Mills

18

ノード10.5以降マルチスレッドのサポートが提供されていますが、試験的なものです。これがすぐに安定することを願っています。

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


更新

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

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


9

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

https://github.com/Microsoft/napajs

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



3

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

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

  • 小さなワーカーはワーカーのスポーンを許可しましたが、同じメッセージループを共有しているように見えました(しかし、それは私が何か間違ったことをした可能性があります- スレッドがより多くのドキュメントを持っているので、本当に複数のプロセスを使用していると確信したので、機能するまで続けました)
  • webworker-threadsrequire、必要なワーカーのモジュールを-ing できませんでした

そして、なぜ私が本当のマルチスレッディングを必要としたのかを尋ねる人のために:Raspberry Piと割り込みを含むアプリケーション用 1つのスレッドがこれらの割り込みを処理し、別のスレッドがデータ(およびその他)の格納を処理します。


1
私はこの答えに入れられた素晴らしい考えに感謝します!
MLissCetrus

3

nodejs 10.5.0リリースは、Node.jsでのマルチスレッド化を発表しました。この機能はまだ実験段階です。現在、新しいworker_threadsモジュールが利用可能です。

Node.js v10.5.0以降を実行すれば、ワーカースレッドの使用を開始できますが、これは試験的なAPIです。デフォルトでは使用できません。Node.jsを呼び出すときに--experimental-workerを使用して有効にする必要があります  。

ES6worker_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

2
これはあなたの記事ですか:blog.logrocket.com/…
serv-inc

いいえ、違います...私はそれを過去にさかのぼって参照しました。
priyeshdkr



0

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

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


2
これはスレッドとは関係ありません。それらはすべて同じスレッドで実行されます。
エヴァンキャロル

@EvanCarroll-私は十分に明確ではなかったことを警告してくれてありがとう。なぜ誰かがスレッドレーシングを調べているのかという仮定の前に、ノードのイベントループでプロミスを使用していることを指摘しました。別の言語から来た場合、スレッドの機能を達成したいが、イベントループやプロミスにまだ慣れていない可能性が非常に高いです。それがあなたの目標であるならば、それを達成するより簡単な方法があることに注意したいです。これはスレッドを使用しないことを括弧で囲みました。これで問題が解決したかどうかをお知らせください。
スマイルハム2017

また、「他のすべてのスレッド間でいずれかのメソッドが失敗した場合は強制終了する必要がある」というOPの基準にも答えているようで、関連性があると考えました。
スマイルハム2017

Promise.raceはすべてのPromiseを順次実行し、非同期操作の場合は1つから別のPromiseに切り替えます(非同期関数の場合は待機します)。
Nagabhushan Baddi

0

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

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

Node.jsマルチスレッドではなく、JavaScriptマルチスレッド用のGoogle。Webワーカー、プロミス、およびその他のことについて調べます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.