情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

Node.jsで非同期的な処理を実行する優先度付きキューを作成する

非同期的な処理を実行する優先度付きキューを作成するにはasyncモジュールのasync.priorityQueue関数を使用します。

async.priorityQueue関数

var async = require('async');

var q = async.priorityQueue(function (data, callback) {
    callback(null);
    //or
    callback(err);
}, 10);

第1引数

第1引数に非同期的な処理を関数として指定します。

この関数の第1引数は非同期的な処理のパラメータであり、第2引数はコールバック関数です。

処理が完了した場合や処理の実行中にエラーが発生した場合には必ずこのコールバック関数を呼び出さなければなりません。

このコールバック関数の第1引数にはエラーオブジェクト(エラーが発生しなかった場合にはnull)を指定します。

第2引数

第2引数にワーカーの数を指定します。この引数は指定しなくても構いません。デフォルトは1です。

ワーカーが優先度付きキューに追加された非同期的な処理の実行を行います。

すなわち、たとえば、ワーカーの数が10である場合には最大で10個の非同期的な処理が並列的に実行されます。10個を超える未完了の非同期的な処理がある場合には10個を超える分に関しては優先度付きキューに格納され、実行が待機されます。

返り値

返り値として優先度付きキューを表すオブジェクトが得られます。

このオブジェクトは主に下のようなプロパティを含みます。

  • length・・・実行を待機している非同期的な処理の数を返す関数です。
  • running・・・実行中の非同期的な処理の数を返す関数です。
  • concurrency・・・ワーカーの数です。このプロパティの値を変更することによってワーカーの数を変更することができます
  • push・・・新しい非同期的な処理を優先度付きキューに追加する関数です。第1引数に非同期的な処理のパラメータを指定します。第2引数に優先度を指定します。第3引数にコールバック関数を指定します。第3引数は指定しなくても構いません。このコールバック関数の第1引数はエラーオブジェクトです。
  • pause・・・優先度付きキューの動作を停止する関数です。
  • resume・・・優先度付きキューの動作を再開する関数です。

サンプルコード1

async-priority-queue.js

var async = require('async');
var util = require('util');

var q = async.priorityQueue(function (data, callback) {
    util.log(data);
    console.log('length: ' + q.length());
    console.log('running: ' + q.running());
    var r = Math.random();
    if (r < 0.8) {
        q.push(r, r);
    }
    setTimeout(function () {
        callback(null);
    }, data * 1000);
}, 2);
var r = Math.random();
q.push(r, r);
var r = Math.random();
q.push(r, r);
var r = Math.random();
q.push(r, r);
var r = Math.random();
q.push(r, r);
var r = Math.random();
q.push(r, r);

使用パッケージ

  • Async.js
    npm install asyncでインストールします。

実行結果

C:\work\node>node async-priority-queue.js
21 Jul 11:01:35 - 0.1474197708644962
length: 4
running: 1
21 Jul 11:01:35 - 0.17304533307188175
length: 4
running: 2
21 Jul 11:01:35 - 0.22791742209820853
length: 3
running: 2
21 Jul 11:01:35 - 0.18067765113141188
length: 3
running: 2
21 Jul 11:01:36 - 0.643984776793946
length: 2
running: 2
21 Jul 11:01:36 - 0.6749185175515864
length: 2
running: 2
21 Jul 11:01:36 - 0.008016208307511041
length: 2
running: 2
21 Jul 11:01:36 - 0.46615495942976115
length: 2
running: 2
21 Jul 11:01:36 - 0.5596530459944282
length: 2
running: 2
21 Jul 11:01:37 - 0.37992885725900116
length: 2
running: 2
21 Jul 11:01:37 - 0.6858101916843176
length: 1
running: 2
21 Jul 11:01:37 - 0.6681957261610645
length: 1
running: 2
21 Jul 11:01:38 - 0.03398674835033133
length: 1
running: 2
21 Jul 11:01:38 - 0.3559448336931281
length: 1
running: 2
21 Jul 11:01:38 - 0.6965275130251714
length: 0
running: 2
21 Jul 11:01:38 - 0.711497808370829
length: 0
running: 2

関連

pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-Node.js