Node.js でのマルチスレッド

Waqar Aslam 2023年10月12日
Node.js でのマルチスレッド

Node.js では、マルチスレッドという用語は適用されません。Node.js はシングルスレッドのイベント ループで実行されるように設計されているためです。 ただし、Node.js は、デフォルトでシングルスレッドである JavaScript 言語の上に構築されています。

ただし、Node.js には、並行プログラミング タスクを実行する方法がいくつか用意されています。 これを行う 1つの方法は、child_process モジュールを使用することです。これにより、メインの Node.js プロセスと同時に実行できる新しいプロセスを生成できます。

Node.js で並行タスクを実行するもう 1つの方法は、async/await 構文を使用することです。これにより、同期しているように見える非同期コードを記述できます。 これにより、新しいプロセスを明示的に生成したり、コールバックを使用したりすることなく、複数のタスクを同時に実行するコードを簡単に記述できます。

たとえば、次のコードは async/await を使用して 2つのタスクを同時に実行します。

async function runTasks() {
  const task1 = doTask1();
  const task2 = doTask2();

  await Promise.all([task1, task2]);
}

この例では、doTask1doTask2Promises を返す非同期関数です。 await 演算子は、続行する前に両方の Promises が解決するのを待つために使用されます。

これにより、2つのタスクを順次ではなく同時に実行できます。 async/await 構文が JavaScript の Promise 型の上に構築されていることは注目に値します。これにより、従来の同期コードに似た方法で非同期コードを記述できます。

Node.js の child_process モジュールは、新しいプロセスを生成する簡単な方法を提供します。 Node.js プログラム内から、Bash スクリプトやその他の実行可能ファイルなどの外部プログラムを実行できます。

Node.js でマルチスレッドを実装する

child_process モジュールを使用して Bash スクリプトを実行する例を次に示します。

この例では、exec 関数を使用して、bash_script.sh という Bash スクリプトを実行します。 この関数は、プロセスが終了したときに呼び出されるコールバックを受け取ります。

コールバックは、errorstdout、および stderr の 3つの引数を受け取ります。 これらの引数には、発生したエラー、プロセスの標準出力、およびプロセスの標準エラーがそれぞれ含まれます。

child_process モジュールは、spawnforkexecFile など、プロセスを生成するためのいくつかの関数を提供します。 これらの関数にはそれぞれ独自のオプションと動作のセットがあるため、ニーズに最適なものを選択できます。

const {exec} = require('child_process');

exec('bash_script.sh', (error, stdout, stderr) => {
  if (error) {
    console.error(`exec error: ${error}`);
    return;
  }
  console.log(`Script run successfully`);
});

出力:

stdout:
stderr:
Script run successfully
著者: Waqar Aslam
Waqar Aslam avatar Waqar Aslam avatar

I am Waqar having 5+ years of software engineering experience. I have been in the industry as a javascript web and mobile developer for 3 years working with multiple frameworks such as nodejs, react js, react native, Ionic, and angular js. After which I Switched to flutter mobile development. I have 2 years of experience building android and ios apps with flutter. For the backend, I have experience with rest APIs, Aws, and firebase. I have also written articles related to problem-solving and best practices in C, C++, Javascript, C#, and power shell.

LinkedIn