はじめに
node.jsのコードの中でbetter-queueモジュールを使用する機会があったので、どのようなモジュールであるのか簡単にまとめたいと思います。
better-queueモジュールとは
Node.js環境で使用されるジョブ(タスク)キューを提供するためのモジュールです。主に、複数の非同期タスクを効率的に処理し、同時に実行されるタスク数を制御したい場合に便利です。シンプルかつ柔軟な設計で、並列処理、再試行、失敗時の処理、タスクの永続化などの機能をサポートします。
サンプルコード
const Queue = require("better-queue");
// キューの処理
const queue = new Queue((task, cb) => {
console.log(`Processing task: ${task.name}`);
// 非同期処理
setTimeout(() => {
if (task.name === "Task 2") {
console.error("An error occurred in Task 2");
cb(true); // エラーが発生したことを通知
} else {
console.log(`Task ${task.name} complete`);
cb(); // 成功を通知
}
}, 1000);
});
// タスクをキューに追加
queue.push({ name: "Task 1" });
queue.push({ name: "Task 2" });
queue.push({ name: "Task 3" });
・const Queue = require('better-queue');
better-queueライブラリを読み込んで、Queueクラスを使用できるようにしています。このクラスは、タスクのキューを管理するためのメインのインターフェースです。
・const queue = new Queue((task, cb) => {
ここで新しいキューqueueを作成しています。Queue()コンストラクタに渡している引数は、タスクの処理方法を定義するコールバック関数です。この関数は、キューからタスクを1つ取り出して実行する際に呼び出されます。つまりはこの関数は、(task,cb) => {}のことです。
taskはキューに追加されたタスクのオブジェクトを表し、cbはそのタスクが完了したことを通知するためのコールバック関数です。
・setTimeout(() => {
setTimeout()を使って非同期処理をシミュレートしています。実際にはこの部分で時間がかかるような処理(例えば、ファイルの読み書きやAPIの呼び出し)が行われます。
・if (task.name === 'Task 2') {
console.error('An error occurred in Task 2');
cb(true);
}
タスク名がTask 2だった場合、エラーを発生させてcb(true)を呼び出し、エラーが発生したことをキューに通知しています。
・else {
console.log(Task ${task.name} complete
);
cb();
}
それ以外のタスクでは、cb()を呼んでタスクが正常に完了したことを通知しています。
・queue.push({ name: 'Task 1' });
queue.push({ name: 'Task 2' });
queue.push({ name: 'Task 3' });
queue.push()メソッドを使って、タスクをキューに追加しています。それぞれのタスクはnameというプロパティを持つオブジェクトです。
Task 1、Task 2、Task 3の順番でキューに追加されており、キューが1つずつタスクを処理していきます。
動作フロー
- Task 1の処理を開始し、1秒後に完了。
- Task 2の処理を開始し、1秒後にエラーが発生。
- Task 3の処理を開始し、1秒後に完了。
実行結果
キューに追加された順番通りに実行されています。console.error()の部分が赤字で表示されています。
まとめ
node.jsのbetter-queueモジュールの使用方法についてまとめました。このモジュールは他にも色々な使い方が出来ると思いますので、いずれ追記するかもしれません。
Reference