ライブラリを使わずPromiseで書いてみました。順次実行する配列を作ってPromise.allで平行実行しています。
// 同時実行数を制限
let users = [];
for(let i=0; i<100; i++){
users.push(()=> {
return new Promise((resolve, reject)=>{
db.User.create({
name: `name-${i}`
}).then((user)=>{
console.log(user.name);
resolve(user);
}).catch((error)=>{
console.log(error);
reject(error);
});
});
});
}
const CONCURRENT_NUM = 3;
const splitUsers = [];
// 平行数から1列ずつの数を求める
let splitCount = users.length/CONCURRENT_NUM;
splitCount = splitCount < CONCURRENT_NUM ? CONCURRENT_NUM : splitCount;
for(let i=0; users.length > i*splitCount; i++){
const row = new Promise((resolve, reject)=>{
// 並列数になるように分割
const sliceList = users.slice(i*splitCount, i*splitCount+splitCount);
// 最後にresolve追加
sliceList.push(() => { resolve() });
// 分割後の配列を順次実行
sliceList.reduce((prev, curr) => {
return prev.then(curr);
}, Promise.resolve());
});
splitUsers.push(row);
}
// 平行実行して最後にDBへの接続をclose
Promise.all(splitUsers).then(()=>{
db.sequelize.close();
}).catch((error)=>{
console.log(error);
});
ログ
分割した配列ごと平行に実行されているのがわかります。
Executing (default): INSERT INTO `Users` (`id`,`name`,`createdAt`,`updatedAt`) VALUES (DEFAULT,'name-0','2018-03-23 23:18:49','2018-03-23 23:18:49');
Executing (default): INSERT INTO `Users` (`id`,`name`,`createdAt`,`updatedAt`) VALUES (DEFAULT,'name-33','2018-03-23 23:18:49','2018-03-23 23:18:49');
Executing (default): INSERT INTO `Users` (`id`,`name`,`createdAt`,`updatedAt`) VALUES (DEFAULT,'name-66','2018-03-23 23:18:49','2018-03-23 23:18:49');
Executing (default): INSERT INTO `Users` (`id`,`name`,`createdAt`,`updatedAt`) VALUES (DEFAULT,'name-34','2018-03-23 23:18:49','2018-03-23 23:18:49');
Executing (default): INSERT INTO `Users` (`id`,`name`,`createdAt`,`updatedAt`) VALUES (DEFAULT,'name-67','2018-03-23 23:18:49','2018-03-23 23:18:49');
Executing (default): INSERT INTO `Users` (`id`,`name`,`createdAt`,`updatedAt`) VALUES (DEFAULT,'name-1','2018-03-23 23:18:50','2018-03-23 23:18:50');
Executing (default): INSERT INTO `Users` (`id`,`name`,`createdAt`,`updatedAt`) VALUES (DEFAULT,'name-35','2018-03-23 23:18:50','2018-03-23 23:18:50');
Executing (default): INSERT INTO `Users` (`id`,`name`,`createdAt`,`updatedAt`) VALUES (DEFAULT,'name-2','2018-03-23 23:18:50','2018-03-23 23:18:50');
Executing (default): INSERT INTO `Users` (`id`,`name`,`createdAt`,`updatedAt`) VALUES (DEFAULT,'name-68','2018-03-23 23:18:50','2018-03-23 23:18:50');
Executing (default): INSERT INTO `Users` (`id`,`name`,`createdAt`,`updatedAt`) VALUES (DEFAULT,'name-36','2018-03-23 23:18:50','2018-03-23 23:18:50');
…