Sequelizeで同時実行数を制限してクエリを実行する

ライブラリを使わずPromiseで書いてみました。順次実行する配列を作ってPromise.allで平行実行しています。

順次実行の詳細はこちら

Promiseで同時平行数を制限してクエリを実行する
// 同時実行数を制限
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');
…