- 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」軍曹を参考にさせていただきました。
|