情報アイランド

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

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

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

async.queue関数

var async = require('async');

var q = async.queue(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引数にコールバック関数を指定します。第2引数は指定しなくても構いません。このコールバック関数の第1引数はエラーオブジェクトです。
  • unshift・・・新しい非同期的な処理をキューの先頭に追加する関数です。第1引数に非同期的な処理のパラメータを指定します。第2引数にコールバック関数を指定します。第2引数は指定しなくても構いません。このコールバック関数の第1引数はエラーオブジェクトです。
  • pause・・・キューの動作を停止する関数です。
  • resume・・・キューの動作を再開する関数です。

サンプルコード1

async-queue.js

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

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

使用パッケージ

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

実行結果

C:\work\node>node async-queue.js
21 Jul 10:30:19 - 0.32241141137557117
length: 4
running: 1
21 Jul 10:30:19 - 0.7913291081399845
length: 4
running: 2
21 Jul 10:30:19 - 0.4487176845182652
length: 3
running: 2
21 Jul 10:30:20 - 0.8606673803279483
length: 2
running: 2
21 Jul 10:30:20 - 0.6653209679545693
length: 1
running: 2
21 Jul 10:30:20 - 0.10173600994281351
length: 0
running: 2
21 Jul 10:30:21 - 0.3849235454549407
length: 0
running: 2
21 Jul 10:30:21 - 0.22078565904458003
length: 0
running: 2

関連

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

-Node.js