LoginSignup
0
0

More than 5 years have passed since last update.

Q での非同期処理の分散数を qlimit で限定する

Posted at

package.json

{
  "name": "qlimit-sample",
  "version": "1.0.0",
  "description": "",
  "scripts": {},
  "author": "",
  "license": "MIT",
  "devDependencies": {
  },
  "dependencies": {
    "command-line-args": "^3.0.0",
    "moment": "^2.13.0",
    "q": "^1.4.1",
    "qlimit": "^0.1.1",
    "sleep-async": "^1.0.1"
  }
}

run.js

var exec = require('child_process').exec;
var moment = require('moment');
var Q = require('q');
var qlimit = require('qlimit');
var asleep = require('sleep-async')();
var limit = qlimit(3);

var tasks  = [];
for(var i = 0; i < 10; i++){
    tasks.push("task_" + i);
}

function log(message){
    var dict = {};
    dict["time"] = moment().format();
    dict["message"] = message;
    console.log(JSON.stringify(dict));
}

Q.when(1).
then(function(){
    var d = Q.defer();
    log("init_1");
    asleep.sleep(3000, function(){
        log("init_2");
        d.resolve();
    });
    return d.promise;
}).then(function(){
    var d = Q.defer();
    Q.all(tasks.map(limit(function(task) { 
        var _d = Q.defer();
        try{
            command = "sleep 2";
            exec(command, (error, stdout, stderr) => {
                log(task + "-1");
                asleep.sleep(2000, function(){
                    log(task + "-2");
                    _d.resolve();
                });
            });
        } catch( error ){
             log(error);
        }
        return _d.promise;
    })))
    .then(function(data){
        d.resolve();
    });
    return d.promise;
}).then(function(){
    var d = Q.defer();
    log("shutdown_1");
    asleep.sleep(3000, function(){
        log("shutdown_2");
        d.resolve();
    });
    return d.promise;
}).catch(function(error){
    log(error);
}).done(function(){
    log("done");
});

で、

nvm use v4.3.2
npm install
node run.js

などとすると、

{"time":"2016-08-28T03:52:18+09:00","message":"init_1"}
{"time":"2016-08-28T03:52:21+09:00","message":"init_2"}
{"time":"2016-08-28T03:52:23+09:00","message":"task_0-1"}
{"time":"2016-08-28T03:52:23+09:00","message":"task_1-1"}
{"time":"2016-08-28T03:52:23+09:00","message":"task_2-1"}
{"time":"2016-08-28T03:52:25+09:00","message":"task_0-2"}
{"time":"2016-08-28T03:52:25+09:00","message":"task_1-2"}
{"time":"2016-08-28T03:52:25+09:00","message":"task_2-2"}
{"time":"2016-08-28T03:52:28+09:00","message":"task_3-1"}
{"time":"2016-08-28T03:52:28+09:00","message":"task_4-1"}
{"time":"2016-08-28T03:52:28+09:00","message":"task_5-1"}
{"time":"2016-08-28T03:52:30+09:00","message":"task_5-2"}
{"time":"2016-08-28T03:52:30+09:00","message":"task_3-2"}
{"time":"2016-08-28T03:52:30+09:00","message":"task_4-2"}
{"time":"2016-08-28T03:52:32+09:00","message":"task_7-1"}
{"time":"2016-08-28T03:52:32+09:00","message":"task_6-1"}
{"time":"2016-08-28T03:52:32+09:00","message":"task_8-1"}
{"time":"2016-08-28T03:52:34+09:00","message":"task_7-2"}
{"time":"2016-08-28T03:52:34+09:00","message":"task_6-2"}
{"time":"2016-08-28T03:52:34+09:00","message":"task_8-2"}
{"time":"2016-08-28T03:52:36+09:00","message":"task_9-1"}
{"time":"2016-08-28T03:52:38+09:00","message":"task_9-2"}
{"time":"2016-08-28T03:52:38+09:00","message":"shutdown_1"}
{"time":"2016-08-28T03:52:41+09:00","message":"shutdown_2"}
{"time":"2016-08-28T03:52:41+09:00","message":"done"}

と 3 tasks ずつ非同期で実行してくれる。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0