JavaScript - node + express(MQTT・定時処理)- スレッド


クラウディア 


1. 概要
2. スレッドの記述
3. 参考サイト

1. 概要

 前ページで、定周期処理や定時処理を動作させる方法について、記述しましたが。  今度は、それを、スレッドで動作させる方法について、記述します。

2. スレッドの記述

 スレッドソースをプロジェクト配下に2つ作成します。

/path/to/js/thread1.js
/path/to/js/thread2.js
 ソースをそれぞれ、下記のように記述します。

const { parentPort, workerData } = require('worker_threads');

parentPort.postMessage({ type: 'log', level: 'info', msg: '毎分処理 1 開始' });

parentPort.postMessage({ type: 'log', level: 'info', msg: '毎分処理 1 開始' });

const { parentPort, workerData } = require('worker_threads');

parentPort.postMessage({ type: 'log', level: 'info', msg: '毎分処理 2 開始' });

parentPort.postMessage({ type: 'log', level: 'info', msg: '毎分処理 2 開始' });
 呼び出し元で、下記のように記述します(「winston」の設定箇所は省略)。

const { Worker } = require('worker_threads');

const cron1 = require('node-cron');
cron1.schedule('* * * * *', async () => {
  const worker1 = new Worker('./js/thread1.js');

  worker1.on('message', (msg) => {
    if (msg.type === 'log') {
      logger.log(msg.level, msg.msg);
    }
  });
});

const cron2 = require('node-cron');
cron2.schedule('* * * * *', async () => {
  const worker2 = new Worker('./js/thread2.js');

  worker2.on('message', (msg) => {
    if (msg.type === 'log') {
      logger.log(msg.level, msg.msg);
    }
  });
});
 スレッド側の、3、5行目は、呼び出し元に、ログ用のメッセージを投げています。  呼び出しもとは、「worker1.on('message', (msg))」で受信したメッセージをログに出力しています。  ログをファイル化している場合、複数の「Worker」や複数の非同期処理が同時に同じログファイルへ書くと、ログが混在・欠落・破損する可能性があるので、呼び出し元でまとめて出して、問題が発生しないようにしているのです。

3. 参考サイト

 本ページは、「ChatGPT」軍曹を参考にさせていただきました。

EaseUS